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

时间:2022-04-14 16:58:49

一、下载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结构如下图所示:

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

操作主要在文件夹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;\n"
#define SET_DBASE "use %s;\n"
#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 

-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如下:

 -- Sccsid:     @(#)dss.ddl    2.1.8.1
drop database tpch;
create database tpch;
use tpch; CREATE TABLE NATION ( N_NATIONKEY INTEGER NOT NULL,
N_NAME CHAR() NOT NULL,
N_REGIONKEY INTEGER NOT NULL,
N_COMMENT VARCHAR()); CREATE TABLE REGION ( R_REGIONKEY INTEGER NOT NULL,
R_NAME CHAR() NOT NULL,
R_COMMENT VARCHAR()); CREATE TABLE PART ( P_PARTKEY INTEGER NOT NULL,
P_NAME VARCHAR() NOT NULL,
P_MFGR CHAR() NOT NULL,
P_BRAND CHAR() NOT NULL,
P_TYPE VARCHAR() NOT NULL,
P_SIZE INTEGER NOT NULL,
P_CONTAINER CHAR() NOT NULL,
P_RETAILPRICE DECIMAL(,) NOT NULL,
P_COMMENT VARCHAR() NOT NULL ); CREATE TABLE SUPPLIER ( S_SUPPKEY INTEGER NOT NULL,
S_NAME CHAR() NOT NULL,
S_ADDRESS VARCHAR() NOT NULL,
S_NATIONKEY INTEGER NOT NULL,
S_PHONE CHAR() NOT NULL,
S_ACCTBAL DECIMAL(,) NOT NULL,
S_COMMENT VARCHAR() NOT NULL); CREATE TABLE PARTSUPP ( PS_PARTKEY INTEGER NOT NULL,
PS_SUPPKEY INTEGER NOT NULL,
PS_AVAILQTY INTEGER NOT NULL,
PS_SUPPLYCOST DECIMAL(,) NOT NULL,
PS_COMMENT VARCHAR() NOT NULL ); CREATE TABLE CUSTOMER ( C_CUSTKEY INTEGER NOT NULL,
C_NAME VARCHAR() NOT NULL,
C_ADDRESS VARCHAR() NOT NULL,
C_NATIONKEY INTEGER NOT NULL,
C_PHONE CHAR() NOT NULL,
C_ACCTBAL DECIMAL(,) NOT NULL,
C_MKTSEGMENT CHAR() NOT NULL,
C_COMMENT VARCHAR() NOT NULL); CREATE TABLE ORDERS ( O_ORDERKEY INTEGER NOT NULL,
O_CUSTKEY INTEGER NOT NULL,
O_ORDERSTATUS CHAR() NOT NULL,
O_TOTALPRICE DECIMAL(,) NOT NULL,
O_ORDERDATE DATE NOT NULL,
O_ORDERPRIORITY CHAR() NOT NULL,
O_CLERK CHAR() NOT NULL,
O_SHIPPRIORITY INTEGER NOT NULL,
O_COMMENT VARCHAR() NOT NULL); CREATE TABLE LINEITEM ( L_ORDERKEY INTEGER NOT NULL,
L_PARTKEY INTEGER NOT NULL,
L_SUPPKEY INTEGER NOT NULL,
L_LINENUMBER INTEGER NOT NULL,
L_QUANTITY DECIMAL(,) NOT NULL,
L_EXTENDEDPRICE DECIMAL(,) NOT NULL,
L_DISCOUNT DECIMAL(,) NOT NULL,
L_TAX DECIMAL(,) NOT NULL,
L_RETURNFLAG CHAR() NOT NULL,
L_LINESTATUS CHAR() NOT NULL,
L_SHIPDATE DATE NOT NULL,
L_COMMITDATE DATE NOT NULL,
L_RECEIPTDATE DATE NOT NULL,
L_SHIPINSTRUCT CHAR() NOT NULL,
L_SHIPMODE CHAR() NOT NULL,
L_COMMENT VARCHAR() NOT NULL);

2、修改dss.ri

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

 -- Sccsid:     @(#)dss.ri    2.1.8.1
-- tpch Benchmark Version 8.0 use tpch; -- ALTER TABLE tpch.REGION DROP PRIMARY KEY;
-- ALTER TABLE tpch.NATION DROP PRIMARY KEY;
-- ALTER TABLE tpch.PART DROP PRIMARY KEY;
-- ALTER TABLE tpch.SUPPLIER DROP PRIMARY KEY;
-- ALTER TABLE tpch.PARTSUPP DROP PRIMARY KEY;
-- ALTER TABLE tpch.ORDERS DROP PRIMARY KEY;
-- ALTER TABLE tpch.LINEITEM DROP PRIMARY KEY;
-- ALTER TABLE tpch.CUSTOMER DROP PRIMARY KEY; -- For table REGION
ALTER TABLE tpch.REGION
ADD PRIMARY KEY (R_REGIONKEY); -- For table NATION
ALTER TABLE tpch.NATION
ADD PRIMARY KEY (N_NATIONKEY); ALTER TABLE tpch.NATION
ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.REGION(R_REGIONKEY); COMMIT WORK; -- For table PART
ALTER TABLE tpch.PART
ADD PRIMARY KEY (P_PARTKEY); COMMIT WORK; -- For table SUPPLIER
ALTER TABLE tpch.SUPPLIER
ADD PRIMARY KEY (S_SUPPKEY); ALTER TABLE tpch.SUPPLIER
ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references tpch.NATION(N_NATIONKEY); COMMIT WORK; -- For table PARTSUPP
ALTER TABLE tpch.PARTSUPP
ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY); COMMIT WORK; -- For table CUSTOMER
ALTER TABLE tpch.CUSTOMER
ADD PRIMARY KEY (C_CUSTKEY); ALTER TABLE tpch.CUSTOMER
ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references tpch.NATION(N_NATIONKEY); COMMIT WORK; -- For table LINEITEM
ALTER TABLE tpch.LINEITEM
ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER); COMMIT WORK; -- For table ORDERS
ALTER TABLE tpch.ORDERS
ADD PRIMARY KEY (O_ORDERKEY); COMMIT WORK; -- For table PARTSUPP
ALTER TABLE tpch.PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references tpch.SUPPLIER(S_SUPPKEY); COMMIT WORK; ALTER TABLE tpch.PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references tpch.PART(P_PARTKEY); COMMIT WORK; -- For table ORDERS
ALTER TABLE tpch.ORDERS
ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references tpch.CUSTOMER(C_CUSTKEY); COMMIT WORK; -- For table LINEITEM
ALTER TABLE tpch.LINEITEM
ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references tpch.ORDERS(O_ORDERKEY); COMMIT WORK; ALTER TABLE tpch.LINEITEM
ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references
tpch.PARTSUPP(PS_PARTKEY,PS_SUPPKEY); COMMIT WORK; use tpch; alter table CUSTOMER rename to customer ;
alter table LINEITEM rename to lineitem ;
alter table NATION rename to nation ;
alter table ORDERS rename to orders ;
alter table PART rename to part ;
alter table PARTSUPP rename to partsupp ;
alter table REGION rename to region ;
alter table SUPPLIER rename to supplier ;

修改的地方有第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的数据库:

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

接着执行:

mysql> use tpch;
mysql> show tables;

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

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

然后执行:

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

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

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

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

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

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

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

七、导入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 '|\n';

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

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

结果不为空则导入成功。

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

 八、参考

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

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