Weka里如何将arff文件或csv文件批量导入MySQL数据库(六)
这里不多说,直接上干货!
前提博客是
Weka中数据挖掘与机器学习系列之数据格式ARFF和CSV文件格式之间的转换(四)
1、将arff文件批量导入MySQL数据库
我在这里,arff文件以Weka安装目录下data文件夹中的iris.arff文件为例。
这个很简单,直接open file,不多说。
2、将csv文件批量导入MySQL数据库
首选,需要先删除csv文件中第一行对属性名的描述,如下图。
得到
然后,我这里保存到,D:\SoftWare\MySQL Server\MySQL Server 5.0\data\weka
然后,再这里,要先在weka数据库里,先建立表 不然它怎么知道往哪里导数据呢?
科普一下,float 和 real 数据类型被称为近似的数据类型。
或者,直接使用命令行界面,多么的爽 (建议,用命令行界面来操作!!!)
create table iris(sepallength REAL,sepalwidth REAL,petallength REAL,petalwidth REAL,class VARCHAR(20));
养成习惯,立马去查看数据库的属性
并在命令行下执行以上批处理语句:
load data infile '\iris.csv' into table iris fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n';
因为,这会直接,去加载(默认),
直接把命令,复制进去
是一模一样的!
当然,大家,不仅可以这样,通过MySQL命令行来加载导入MySQL数据库。大家也可以通过如下的java代码来导入哈!
新建java工程,导入驱动包和weka包。进行代码编写和设计。
package sdust.lab207.data; import java.io.File; import weka.core.Instance; import weka.core.Instances; import weka.core.converters.ArffLoader; import weka.core.converters.DatabaseLoader; import weka.core.converters.ConverterUtils.DataSource; import weka.experiment.InstanceQuery; /** * @author LbZhang * @version 创建时间:2016年6月10日 上午10:16:23 * @description 数据加载 weka.core.Instances; 1.Weka处理的数据表格中,一个横行称为一个实例(Instance),竖行代表一个属性(Arrtibute),数据表格称为一个数据集,在weka看来,呈现了属性之间的一种关系(Relation) 2.Weka存储数据的格式是ARFF(Attribute-RelationFile Format)文件,这是一种ASCII文本文件。 3.Weka的ARFF文件可以分为两部分。第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。第二部分给出了数据信息(Data information),即数据集中给出的数据。从@Data标记开始,后面的就是数据信息了。 4.Weka作为数据挖掘,面临的第一个问题往往是我们的数据不是ARFF格式的。幸好,WEKA还提供了对CSV文件的支持,而这种格式是被许多其他软件所支持的。此外,WEKA还提供了通过JDBC访问数据库的功能。 */ public class DataLoad { /** * Open Declaration weka.core.converters.ConverterUtils.DataSource * DataSource(数据源)类是weka.core.converters.ConverterUtils的内部类,用于从有适当文件扩展名的文件中读取数据。 * * */ public static void main(String[] args) { //DataLoad.testFileload(); DataLoad.testDBload(); } private static void testDBload() { try { //InstanceQuery使用 InstanceQuery iq = new InstanceQuery(); iq.setDatabaseURL("jdbc:mysql://127.0.0.1:3306/jdtaobao"); iq.setUsername("root"); iq.setPassword("root"); iq.setQuery("SELECT * FROM tb_timestat"); //iq.setSparseData(true); Instances ist = iq.retrieveInstances(); System.out.println(ist.checkForStringAttributes()); System.out.println(ist.get(0)); System.out.println(ist.attributeStats(0)); // System.out.println(ist.get(2)); DatabaseLoader dloader = new DatabaseLoader(); String jdurl="jdbc:mysql://127.0.0.1:3306/jdtaobao"; String user = "root"; String pass = "root"; dloader.setSource(jdurl,user,pass); dloader.setQuery("SELECT * FROM tb_timestat"); //批量检索 Instances data = dloader.getDataSet(); // System.out.println(data.classIndex()); // System.out.println(data.size()); // System.out.println(data.get(0)); System.out.println(data.get(data.size()-1)); System.out.println(data); System.out.println(); //增量检索 DatabaseLoader diloader = new DatabaseLoader(); diloader.setSource(jdurl,user,pass); diloader.setQuery("SELECT * FROM tb_user"); Instances structure = diloader.getStructure(); Instances insts = new Instances(structure); Instance inst ; while((inst=diloader.getNextInstance(structure))!=null){ System.out.println(inst); insts.add(inst); } System.out.println(insts); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void testFileload() { try { // 读取数据代码片段 Instances data1 = DataSource.read("data\\cpu.arff"); Instances data2 = DataSource.read("data\\cpu.arff"); // 当要加载的文件的与加载器通常关联的文件扩展名不同时,用户只能直接指定加载器。 // 加载arrf文件代码片段 ArffLoader loader = new ArffLoader(); loader.setSource(new File("data\\cpu.arff")); Instances data = loader.getDataSet();// 获取数据集合 System.out.println(data.classIndex()); // 如果没有设置类别属性 if (data.classIndex() == -1) data.setClassIndex(0); // 使用第一个属性作为类别属性 if (data.classIndex() == -1) data.setClassIndex(data.numAttributes()-1); if (data.classIndex() == -1) {//如果没有设置类别属性列 System.out.println(data1.get(0)); } //System.out.println(data.attribute(0)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
我们这里使用的是mysql数据库,所以我们将DatabaseUtils.props.mysql取代DatabaseUtils.props,并且修改文件的内容。
主要是将内容修改为:
第一步:配置相关的数据库驱动和链接信息
# Database settings for MySQL 3.23.x, 4.x # # General information on database access can be found here: # http://weka.wikispaces.com/Databases # # url: http://www.mysql.com/ # jdbc: http://www.mysql.com/products/connector/j/ # author: Fracpete (fracpete at waikato dot ac dot nz) # version: $Revision: 11885 $ # JDBC driver (comma-separated list) #jdbcDriver=org.gjt.mm.mysql.Driver jdbcDriver=com.mysql.jdbc.Driver # database URL #jdbcURL=jdbc:mysql://server_name:3306/database_name jdbcURL=jdbc:mysql://localhost:3306/weka
第二步: 类型去掉注释
# 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
第三步:添加字符转换方式
#mysql-conversion #Text CHAR=0 TINYTEXT=0 TEXT=9 VARCHAR=0 LONGVARCHAR=0 BINARY=0 VARBINARY=0 LONGVARBINARY=0 BLOB=0 MEDIUMTEXT=0 MEDIUMBLOB=0 LONGTEXT=0 LONGBLOB=0 #Number types BIT=1 NUMERIC=2 DECIMAL=2 FLOAT=7 DOUBLE=2 TINYINT=3 SMALLINT=4 #SHORT=4 SHORT=5 INTEGER=5 INT=5 MEDIUMINT=5 BIGINT=6 LONG=6 INT_UNSIGNED=6 #Data Types REAL=7 DATE=8 TIME=8 TIMESTAMP=8 DATETIME=8 # other options CREATE_DOUBLE=DOUBLE CREATE_STRING=TEXT CREATE_INT=INT CREATE_DATE=DATETIME DateFormat=yyyy-MM-dd HH:mm:ss checkUpperCaseNames=false checkLowerCaseNames=false checkForTable=true
第三步:添加字符转换方式 #mysql-conversion #Text CHAR=0 TINYTEXT=0 TEXT=9 VARCHAR=0 LONGVARCHAR=0 BINARY=0 VARBINARY=0 LONGVARBINARY=0 BLOB=0 MEDIUMTEXT=0 MEDIUMBLOB=0 LONGTEXT=0 LONGBLOB=0 #Number types BIT=1 NUMERIC=2 DECIMAL=2 FLOAT=7 DOUBLE=2 TINYINT=3 SMALLINT=4 #SHORT=4 SHORT=5 INTEGER=5 INT=5 MEDIUMINT=5 BIGINT=6 LONG=6 INT_UNSIGNED=6 #Data Types REAL=7 DATE=8 TIME=8 TIMESTAMP=8 DATETIME=8
可能大家会出现如下的问题:
couldn’t read from database unknown data type: INT, Add Entry in weka/experiment/DatabaseUtils.props.
错误处理
问题解决:
主要是因为数据库数据类型 java 数据类型还有weka 数据类型的匹配导致的。
因此第三步是十分重要的!
INT_UNSIGNED=6
VARCHAR=0
等一定要注意INT_UNSIGNED的连接下划线。
作者:大数据和人工智能躺过的坑
出处:http://www.cnblogs.com/zlslch/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!