• 在Linux下将TPC-H数据导入到MySQL


    一、下载TPC-H

    下载地址:http://www.tpc.org/tpc_documents_current_versions/current_specifications.asp 。从这个页面中找到tpc-h,我下载的版本是v2.17.3。下载后会得到一个名为*-tpc-h-tool.zip的压缩包,使用unzip命令将压缩包解压并将解压后的文件夹重命名为tpch_2_17_3, 文件夹tpch_2_7_13结构如下图所示:

    操作主要在文件夹dbgen下进行。

    二、修改makefile.suite

    执行以下命令(注意当前的工作目录):

    hadoop@sench-PC:~/Downloads/tpch_2_17_3/dbgen$ cp makefile.suite makefile
    hadoop@sench-PC:~/Downloads/tpch_2_17_3/dbgen$ vi makefile

    将makefile的第100行到第111行修改为如下代码:

    ################
    ## CHANGE NAME OF ANSI COMPILER HERE
    ################
    CC      = gcc 
    # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
    #                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE
    # Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS, 
    #                                  SGI, SUN, U2200, VMS, LINUX, WIN32 
    # Current values for WORKLOAD are:  TPCH
    DATABASE= MYSQL
    MACHINE = LINUX
    WORKLOAD = TPCH

    修改的地方为:将编译器设置为gcc,将WORKLOAD设为TPCH,以及给DATABASE、MACHINE、WORKLOAD赋值。

    三、修改文件tpcd.h

    在文件tpcd.h开头添加以下代码:

    #ifdef MYSQL
    #define GEN_QUERY_PLAN ""
    #define START_TRAN "START TRANSACTION"
    #define END_TRAN "COMMIT"
    #define SET_OUTPUT ""
    #define SET_ROWCOUNT "limit %d;
    "
    #define SET_DBASE "use %s;
    "
    #endif

    四、生成dbgen

    执行以下命令:

    hadoop@sench-PC:~/Downloads/tpch_2_17_3/dbgen$ make

    执行完成后会在dbgen目录下发现一个可执行文件dbgen

    五、生成.tbl数据文件

    这一步要使用上一步生成的dbgen来生成数据,这些数据存储在8个表中(.tbl),执行以下命令:

    hadoop@sench-PC:~/Downloads/tpch_2_17_3/dbgen$ ./dbgen -s 1

     -s -1表示生成1G的数据 (如果你之前曾经尝试过生成数据,最好先make clean,再重新make,接着到这步加上-f覆盖掉)。完成后我们使用 ls *.tbl 可以看到产生了8个tbl文件:

    hadoop@sench-PC:~/Downloads/tpch_2_17_3/dbgen$ ls *.tbl
    customer.tbl  nation.tbl  partsupp.tbl  region.tbl
    lineitem.tbl  orders.tbl  part.tbl      supplier.tbl

    查看.tbl文件可以看到文件中的数据以‘|’隔开(类似于csv)。

    六、修改初始化脚本

    tpch提供了两个脚本dss.ddl (DSS库初始化DDL脚本)和dss.ri (DSS数据表创建索引、外键脚本),这两个脚本不适用于MySQL,需要进行修改。

    1、修改dss.ddl

    在dss.ddl开头加上以下代码:

    drop database tpch;
    create database tpch;
    use tpch;

    修改后的dss.ddl如下:

     1 -- Sccsid:     @(#)dss.ddl    2.1.8.1
     2 drop database tpch;
     3 create database tpch;
     4 use tpch;
     5 
     6 CREATE TABLE NATION  ( N_NATIONKEY  INTEGER NOT NULL,
     7                             N_NAME       CHAR(25) NOT NULL,
     8                             N_REGIONKEY  INTEGER NOT NULL,
     9                             N_COMMENT    VARCHAR(152));
    10 
    11 CREATE TABLE REGION  ( R_REGIONKEY  INTEGER NOT NULL,
    12                             R_NAME       CHAR(25) NOT NULL,
    13                             R_COMMENT    VARCHAR(152));
    14 
    15 CREATE TABLE PART  ( P_PARTKEY     INTEGER NOT NULL,
    16                           P_NAME        VARCHAR(55) NOT NULL,
    17                           P_MFGR        CHAR(25) NOT NULL,
    18                           P_BRAND       CHAR(10) NOT NULL,
    19                           P_TYPE        VARCHAR(25) NOT NULL,
    20                           P_SIZE        INTEGER NOT NULL,
    21                           P_CONTAINER   CHAR(10) NOT NULL,
    22                           P_RETAILPRICE DECIMAL(15,2) NOT NULL,
    23                           P_COMMENT     VARCHAR(23) NOT NULL );
    24 
    25 CREATE TABLE SUPPLIER ( S_SUPPKEY     INTEGER NOT NULL,
    26                              S_NAME        CHAR(25) NOT NULL,
    27                              S_ADDRESS     VARCHAR(40) NOT NULL,
    28                              S_NATIONKEY   INTEGER NOT NULL,
    29                              S_PHONE       CHAR(15) NOT NULL,
    30                              S_ACCTBAL     DECIMAL(15,2) NOT NULL,
    31                              S_COMMENT     VARCHAR(101) NOT NULL);
    32 
    33 CREATE TABLE PARTSUPP ( PS_PARTKEY     INTEGER NOT NULL,
    34                              PS_SUPPKEY     INTEGER NOT NULL,
    35                              PS_AVAILQTY    INTEGER NOT NULL,
    36                              PS_SUPPLYCOST  DECIMAL(15,2)  NOT NULL,
    37                              PS_COMMENT     VARCHAR(199) NOT NULL );
    38 
    39 CREATE TABLE CUSTOMER ( C_CUSTKEY     INTEGER NOT NULL,
    40                              C_NAME        VARCHAR(25) NOT NULL,
    41                              C_ADDRESS     VARCHAR(40) NOT NULL,
    42                              C_NATIONKEY   INTEGER NOT NULL,
    43                              C_PHONE       CHAR(15) NOT NULL,
    44                              C_ACCTBAL     DECIMAL(15,2)   NOT NULL,
    45                              C_MKTSEGMENT  CHAR(10) NOT NULL,
    46                              C_COMMENT     VARCHAR(117) NOT NULL);
    47 
    48 CREATE TABLE ORDERS  ( O_ORDERKEY       INTEGER NOT NULL,
    49                            O_CUSTKEY        INTEGER NOT NULL,
    50                            O_ORDERSTATUS    CHAR(1) NOT NULL,
    51                            O_TOTALPRICE     DECIMAL(15,2) NOT NULL,
    52                            O_ORDERDATE      DATE NOT NULL,
    53                            O_ORDERPRIORITY  CHAR(15) NOT NULL,  
    54                            O_CLERK          CHAR(15) NOT NULL, 
    55                            O_SHIPPRIORITY   INTEGER NOT NULL,
    56                            O_COMMENT        VARCHAR(79) NOT NULL);
    57 
    58 CREATE TABLE LINEITEM ( L_ORDERKEY    INTEGER NOT NULL,
    59                              L_PARTKEY     INTEGER NOT NULL,
    60                              L_SUPPKEY     INTEGER NOT NULL,
    61                              L_LINENUMBER  INTEGER NOT NULL,
    62                              L_QUANTITY    DECIMAL(15,2) NOT NULL,
    63                              L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL,
    64                              L_DISCOUNT    DECIMAL(15,2) NOT NULL,
    65                              L_TAX         DECIMAL(15,2) NOT NULL,
    66                              L_RETURNFLAG  CHAR(1) NOT NULL,
    67                              L_LINESTATUS  CHAR(1) NOT NULL,
    68                              L_SHIPDATE    DATE NOT NULL,
    69                              L_COMMITDATE  DATE NOT NULL,
    70                              L_RECEIPTDATE DATE NOT NULL,
    71                              L_SHIPINSTRUCT CHAR(25) NOT NULL,
    72                              L_SHIPMODE     CHAR(10) NOT NULL,
    73                              L_COMMENT      VARCHAR(44) NOT NULL);
    View Code

    2、修改dss.ri

    dss.ri修改的地方比较多,修改后的dss.ri如下:

      1 -- Sccsid:     @(#)dss.ri    2.1.8.1
      2 -- tpch Benchmark Version 8.0
      3 
      4 use tpch;
      5 
      6 -- ALTER TABLE tpch.REGION DROP PRIMARY KEY;
      7 -- ALTER TABLE tpch.NATION DROP PRIMARY KEY;
      8 -- ALTER TABLE tpch.PART DROP PRIMARY KEY;
      9 -- ALTER TABLE tpch.SUPPLIER DROP PRIMARY KEY;
     10 -- ALTER TABLE tpch.PARTSUPP DROP PRIMARY KEY;
     11 -- ALTER TABLE tpch.ORDERS DROP PRIMARY KEY;
     12 -- ALTER TABLE tpch.LINEITEM DROP PRIMARY KEY;
     13 -- ALTER TABLE tpch.CUSTOMER DROP PRIMARY KEY;
     14 
     15 
     16 -- For table REGION
     17 ALTER TABLE tpch.REGION
     18 ADD PRIMARY KEY (R_REGIONKEY);
     19 
     20 -- For table NATION
     21 ALTER TABLE tpch.NATION
     22 ADD PRIMARY KEY (N_NATIONKEY);
     23 
     24 ALTER TABLE tpch.NATION
     25 ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.REGION(R_REGIONKEY);
     26 
     27 COMMIT WORK;
     28 
     29 -- For table PART
     30 ALTER TABLE tpch.PART
     31 ADD PRIMARY KEY (P_PARTKEY);
     32 
     33 COMMIT WORK;
     34 
     35 -- For table SUPPLIER
     36 ALTER TABLE tpch.SUPPLIER
     37 ADD PRIMARY KEY (S_SUPPKEY);
     38 
     39 ALTER TABLE tpch.SUPPLIER
     40 ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references tpch.NATION(N_NATIONKEY);
     41 
     42 COMMIT WORK;
     43 
     44 -- For table PARTSUPP
     45 ALTER TABLE tpch.PARTSUPP
     46 ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
     47 
     48 COMMIT WORK;
     49 
     50 -- For table CUSTOMER
     51 ALTER TABLE tpch.CUSTOMER
     52 ADD PRIMARY KEY (C_CUSTKEY);
     53 
     54 ALTER TABLE tpch.CUSTOMER
     55 ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references tpch.NATION(N_NATIONKEY);
     56 
     57 COMMIT WORK;
     58 
     59 -- For table LINEITEM
     60 ALTER TABLE tpch.LINEITEM
     61 ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
     62 
     63 COMMIT WORK;
     64 
     65 -- For table ORDERS
     66 ALTER TABLE tpch.ORDERS
     67 ADD PRIMARY KEY (O_ORDERKEY);
     68 
     69 COMMIT WORK;
     70 
     71 -- For table PARTSUPP
     72 ALTER TABLE tpch.PARTSUPP
     73 ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references tpch.SUPPLIER(S_SUPPKEY);
     74 
     75 COMMIT WORK;
     76 
     77 ALTER TABLE tpch.PARTSUPP
     78 ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references tpch.PART(P_PARTKEY);
     79 
     80 COMMIT WORK;
     81 
     82 -- For table ORDERS
     83 ALTER TABLE tpch.ORDERS
     84 ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references tpch.CUSTOMER(C_CUSTKEY);
     85 
     86 COMMIT WORK;
     87 
     88 -- For table LINEITEM
     89 ALTER TABLE tpch.LINEITEM
     90 ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY)  references tpch.ORDERS(O_ORDERKEY);
     91 
     92 COMMIT WORK;
     93 
     94 ALTER TABLE tpch.LINEITEM
     95 ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references 
     96         tpch.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
     97 
     98 COMMIT WORK;
     99 
    100 use tpch;
    101 
    102 alter table CUSTOMER    rename to customer ;
    103 alter table LINEITEM    rename to lineitem ;
    104 alter table NATION    rename to nation   ;
    105 alter table ORDERS    rename to orders   ;
    106 alter table PART    rename to part     ;
    107 alter table PARTSUPP    rename to partsupp ;
    108 alter table REGION    rename to region   ;
    109 alter table SUPPLIER    rename to supplier ;
    View Code

    修改的地方有第4行、第6~13行(--后添加空格)、第25、40、55、73、78、84 、90、96行(添加外码),第100~109行(将大写表名改为小写),还要注意我们建立的数据库名称为tpch,所有引用表都要使用tpch.表名的形式,比如tpch.REGION

    七、在MySQL中建表

    打开MySQL执行以下语句:

    mysql> . /home/hadoop/Downloads/tpch_2_17_3/dbgen/dss.ddl

    这个命令就是. 加上空格加上dss.ddl的位置。

    然后使用 show databases; 语句可以看到已经建立了一个名为tpch的数据库:

    接着执行:

    mysql> use tpch;
    mysql> show tables;

    可以看到数据库tpch中有8个表:

    然后执行:

    mysql> . /home/hadoop/Downloads/tpch_2_17_3/dbgen/dss.ri

    这句指令给表与表之间添加了主码及外码约束,并且将大写表名改为小写。

    再 show tables; 可以看到表名已经改为了小写:

    我们再使用 show create table 表名; 语句来检查主码与外码约束是否添加。这里对表customer测试结果如下:

    可以看到主码与外码添加成功。

    七、导入tbl文件到表中

    上一步只是建立了表,表中没有数据,使用以下命令导入数据:

    mysql> load data local infile '/home/hadoop/Downloads/tpch_2_17_3/dbgen/part.tbl' into table part fields terminated by '|' lines terminated by '|
    ';

    这句命令将/home/hadoop/Downloads/tpch_2_17_3/dbgen/part.tbl文件里的数据导入到表part中,可以使用语句select * from part limit 5; 来查看是否导入成功:

    结果不为空则导入成功。

    这样只是导入了一个表,还要使用相同结构的语句将剩余的7个tbl文件导入到相应的表中。由于外码约束,所以要注意导入文件的先后顺序。

     八、参考

    1、http://www.cnblogs.com/joyeecheung/p/3599698.html

    2、http://imysql.com/2012/12/21/tpch-for-mysql-manual.html

  • 相关阅读:
    fork()和僵尸进程
    布尔变量面试题
    vue学习之二
    vue学习之一
    圈复杂度
    phpExcel与jq的ajax
    Object.defineProperty与修改某个数组实现监听效果
    mpn不得不说的坑
    论javascript编写优美
    微信小程序之学习
  • 原文地址:https://www.cnblogs.com/sench/p/8033400.html
Copyright © 2020-2023  润新知