Search code examples
javaeclipsepostgresqljdbcweka

WEKA: java.lang.IllegalArgumentException: Unknown data type: int4


I'm trying to connect my postgresql database with WEKA in Eclipse.

When i run the main I get this exception:

Exception in thread "main" java.lang.IllegalArgumentException: Unknown data type: int4. Add entry in weka/experiment/DatabaseUtils.props.
If the type contains blanks, either escape them with a backslash or use underscores instead of blanks.
  • I downloaded WEKA 3-6-14
  • I unzipped the weka.jar
  • I changed the lines of the jdbc url and the jdbc driver in the file weka/experiment/DatabaseUtils.props.postgresql
  • I added the data types that I use in my database
  • I renamed the DatabaseUtils.props.postgresql file to DatabaseUtils.props

This is a segment of my DatabaseUtils.props.postgresql file:

# Database settings for PostgreSQL 7.4
#
# General information on database access can be found here:
# http://weka.wikispaces.com/Databases
#
# url:     http://www.postgresql.org/
# jdbc:    http://jdbc.postgresql.org/
# author:  Fracpete (fracpete at waikato dot ac dot nz)
# version: $Revision: 11887 $

# JDBC driver (comma-separated list)
jdbcDriver=org.postgresql.Driver

# database URL
jdbcURL=jdbc:postgresql://localhost:5432/datamining

# specific data types
string, getString() = 0;    --> nominal
boolean, getBoolean() = 1;  --> nominal
double, getDouble() = 2;    --> numeric
# byte, getByte() = 3;        --> numeric
# short, getByte()= 4;        --> numeric
int, getInteger() = 5;      --> numeric
# long, getLong() = 6;        --> numeric
# float, getFloat() = 7;      --> numeric
# date, getDate() = 8;        --> date
# text, getString() = 9;      --> string
# time, getTime() = 10;       --> date
# timestamp, getTime() = 11;  --> date

# PostgreSQL data types to Java classes information can be found at:
# http://www.postgresql.org/message-id/AANLkTinsk4rwT7v-751bwQkgTN1rkA=8uE-jk69nape-@mail.gmail.com
text=0
boolean=1
double=2
int4=5

This is the code in my main method:

InstanceQuery query = new InstanceQuery();
    query.setUsername("username");
    query.setPassword("password");
    query.setQuery("SELECT * FROM database ORDER BY \"id\"");
    Instances data = query.retrieveInstances();

Can someone please tell me why I'm still getting the exception?


Solution

  • I changed my DatabaseUtils.props code to:

    # Database settings for PostgreSQL 7.4
    #
    # General information on database access can be found here:
    # http://weka.wikispaces.com/Databases
    #
    # url:     http://www.postgresql.org/
    # jdbc:    http://jdbc.postgresql.org/
    # author:  Fracpete (fracpete at waikato dot ac dot nz)
    # version: $Revision: 11885 $
    
    # JDBC driver (comma-separated list)
    jdbcDriver=org.postgresql.Driver
    
    # database URL
    jdbcURL=jdbc:postgresql://localhost:5432/datamining
    
    # specific data types
    # string, getString() = 0;    --> nominal
    # boolean, getBoolean() = 1;  --> nominal
    # double, getDouble() = 2;    --> numeric
    # byte, getByte() = 3;        --> numeric
    # short, getByte()= 4;        --> numeric
    # int, getInteger() = 5;      --> numeric
    # long, getLong() = 6;        --> numeric
    # float, getFloat() = 7;      --> numeric
    # date, getDate() = 8;        --> date
    # text, getString() = 9;      --> string
    # time, getTime() = 10;       --> date
    # timestamp, getTime() = 11;  --> date
    
    # PostgreSQL data types to Java classes information can be found at:
    # http://www.postgresql.org/message-id/AANLkTinsk4rwT7v-751bwQkgTN1rkA=8uE-jk69nape-@mail.gmail.com
    varchar=0
    text=0
    float4=7
    float8=2
    int4=5
    oid=5
    timestamp=8
    date=8
    bool=1
    int2=5
    int8=2
    numeric=2
    bpchar=9
    

    Now it is working. You should also check if the java version of your eclipse is the same as the one of the driver.jar. Otherwise you will get this exception:

    java.lang.NoClassDefFoundError: java/time/temporal/TemporalField