1.4 访问数据库

虽然Weka数据集默认可以保存在ARFF格式的文件中,但很多数据挖掘应用都可能要求直接访问数据库,对数据库表的记录进行挖掘,尤其是在数据集非常大的情况下。Weka使用JDBC访问数据库。

1.4.1 配置文件

首先做三项准备工作:第一,如果Weka正在运行,记得先关闭Weka。第二,下载数据库驱动。Weka支持大部分常用数据库,本书采用的数据库是MySQL 5.6.12,使用的JDBC驱动是com.mysql.jdbc.Driver,因此本书下载mysql-connector-java-5.1.6.jar驱动文件,并设置CLASSPATH环境变量指向该驱动,如图1.21所示,这使得Weka能找到JDBC驱动。第三,启动数据库运行,确保已经建立名称为weka的数据库,为该库建立名称为weka的用户,密码自定,并为该用户赋予足够的权限。

要正常访问数据库,根据计算机的实际情况正确修改配置文件是关键。Weka的配置文件名称为DatabaseUtils.props,位于weka.experiment包中。可以从weka.jar或weka-src.jar归档文件中获取该配置文件。具体做法是,使用解压缩工具将归档文件解开,在weka\experiment子目录下可以找到DatabaseUtils.props配置文件。本书直接在该配置文件的基础上进行修改。

为了方便用户,Weka对常用数据库都提供对应配置文件,在对应配置文件上进行修改要方便得多,具体如下。

(1)DatabaseUtils.props.hsql:适用于HSQLDB数据库。

(2)DatabaseUtils.props.msaccess:适用于MS Access数据库。

(3)DatabaseUtils.props.mssqlserver:适用于MS SQL Server 2000数据库。

(4)DatabaseUtils.props.mssqlserver2005:适用于MS SQL Server 2005数据库。

(5)DatabaseUtils.props.mysql:适用于MySQL数据库。

(6)DatabaseUtils.props.odbc:适用于ODBC/JDBC桥连接的数据库。

(7)DatabaseUtils.props.oracle:适用于Oracle 10g数据库。

(8)DatabaseUtils.props.postgresql:适用于PostgreSQL 7.4数据库。

(9)DatabaseUtils.props.sqlite3:适用于SQLite 3.x数据库。

注意: Weka只会去寻找名称为DatabaseUtils.props的配置文件,如果用户想以其余配置文件中的一个(如DatabaseUtils.props.mysql)作为模板,在此基础上进行修改,一定要记住先改名。

打开配置文件,在文件中找到如程序清单1.2所示的内容。注意到粗体字的两行,分别指定了连接数据库必需的两个参数:jdbcDriver和jdbcURL。

程序清单1.2 原DatabaseUtils.props文件内容

    # The comma-separated list of jdbc drivers to use
    #jdbcDriver=RmiJdbc.RJDriver, jdbc.idbDriver
    #jdbcDriver=jdbc.idbDriver
    #jdbcDriver=RmiJdbc.RJDriver, jdbc.idbDriver, org.gjt.mm.mysql.Driver, com.mckoi.
    JDBCDriver, org.hsqldb.jdbcDriver
    #jdbcDriver=org.gjt.mm.mysql.Driver
    # The url to the experiment database
    #jdbcURL=jdbc:rmi://expserver/jdbc:idb=experiments.prp
    jdbcURL=jdbc:idb=experiments.prp
    #jdbcURL=jdbc:mysql://mysqlserver/username

本书使用MySQL,因此将程序清单1.2所示的粗体字两行分别修改为如下两行:

    jdbcDriver=com.mysql.jdbc.Driver
    jdbcURL=jdbc:mysql://localhost:3306/weka

如果读者使用不同的数据库,或者使用不同的端口号,请根据具体的数据库配置设置这两个参数。

完成DatabaseUtils.props文件的设置后,必须将其放在如下三个固定位置之一,Weka才能找到。

(1)当前目录中。直接放在Weka 3.7的安装目录中。

(2)用户目录中。如果使用Windows的用户不知道自己的用户目录,可以在命令行中输入如下命令:

    echo %USERPROFILE%

这样就可以得到用户目录的路径。Weka 3.7.2以下的版本直接将配置文件放在用户目录中,而Weka 3.7.2以上的版本则需要将配置文件放在用户目录下的wekafiles\props子目录中。

(3)类路径中。通常是weka.jar文件。

注意: Weka也是按上述顺序去查找配置文件的,找到后就不再进行查找,因此前面位置优先于后面位置。

1.4.2 数据库设置

图1.22 SQL查看器

重新启动Weka,在Weka GUI选择器窗口中,单击Explorer按钮,启动探索者界面,单击Open DB按钮,弹出如图1.22所示的SQL查看器。可以看到,URL文本框中的内容已经变成了前文修改的配置文件中jdbcURL的值。

单击按钮,设置数据库连接参数,如图1.23所示。根据自己计算机的实际配置,输入数据库用户名和密码,单击OK按钮完成设置。

图1.23 设置数据库连接参数

单击按钮,连接数据库,如果前面的设置无误,会在SQL查看器下部出现数据库已连接的提示,如图1.24所示。

图1.24 提示数据库已连接

现在,需要从数据库中查询数据。由于本书已经将iris数据集导入到名称为iris的数据库表中,因此只需要输入SQL语句“SELECT * FROM iris”,如图1.25所示,单击Execute按钮执行查询,即可得到如图1.26所示的查询结果。

图1.25 输入SQL语句

图1.26 查询结果

恭喜!您已经完成了较难的工作,从数据库中成功查询到了数据。

1.4.3 常见问题及解决办法

如果读者没有连接上数据库,不要着急。可以按如下顺序依次检查可能产生问题的设置:数据库驱动程序是否正确?CLASSPATH的设置是否正确?配置文件中jdbcDriver和jdbcURL两项配置的拼写是否正确?配置文件是否放到正确位置?数据库用户名和密码是否正确?该数据库用户是否拥有足够权限?数据库是否已经启动?等等。

由于Weka仅支持五种数据类型的属性,即标称型(nominal)、数值型(numeric)、字符串型(string)、日期型(date)和关系型(relational),而数据库种类繁多,支持的字段类型也不统一,因此,表1.2中仅列出Weka支持的通过JDBC将数据库字段类型映射到的Java数据类型,而不一一列举所支持的数据库字段类型。

表1.2 Weka支持的Java类型

有时,某些数据库(如MySQL)可能会出现一些字段类型不能解释为Weka属性类型的情况,这时,就需要将字段类型映射为Weka支持的Java类型。例如,JDBC驱动会将MySQL的TEXT类型映射为BLOB类型,需要在配置文件中手工修改映射关系。在表1.2中已经将映射关系修改为映射到string类型(0),可以在配置文件中找到如下代码行:

    TEXT=0

它证实了配置文件已经将TEXT类型映射为string类型。

特别提示,本书使用MySQL,记得一定要在配置文件中加上如下一条代码行:

    INT=5

它用于将MySQL的INT类型映射为numeric类型。否则在运行第4章的实验时,Weka会报出“Unknown data type INT. Add entry in weka/experiment/DatabaseUtils.props”的错误。