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的连接下划线。