zoukankan      html  css  js  c++  java
  • Weka里如何将arff文件或csv文件批量导入MySQL数据库(六)

      这里不多说,直接上干货!

      前提博客是

    Weka中数据挖掘与机器学习系列之数据格式ARFF和CSV文件格式之间的转换(四)

    1、将arff文件批量导入MySQL数据库

      我在这里,arff文件以Weka安装目录下data文件夹中的iris.arff文件为例。 

       

      这个很简单,直接open file,不多说。

    2、将csv文件批量导入MySQL数据库

      首选,需要先删除csv文件中第一行对属性名的描述,如下图。

       得到

       然后,我这里保存到,D:SoftWareMySQL ServerMySQL Server 5.0dataweka

     

     

     

      然后,再这里,要先在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 '
    '; 

       因为,这会直接,去加载(默认),

      直接把命令,复制进去

     

     

     

       是一模一样的!

      当然,大家,不仅可以这样,通过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的连接下划线。

  • 相关阅读:
    数据库连接池
    一致性hash
    java 集合大家族
    linkedlist
    HashMap
    hashcode
    Job 逻辑执行图
    CDN
    网站缓存
    Mysql临时文件目录控制
  • 原文地址:https://www.cnblogs.com/zlslch/p/6842121.html
Copyright © 2011-2022 走看看