一、下载TPC-H
下载地址: 。从这个页面中找到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 makefilehadoop@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: TPCHDATABASE= MYSQLMACHINE = LINUXWORKLOAD = 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 1
-s -1表示生成1G的数据 (如果你之前曾经尝试过生成数据,最好先make clean,再重新make,接着到这步加上-f覆盖掉)。完成后我们使用 ls *.tbl 可以看到产生了8个tbl文件:
hadoop@sench-PC:~/Downloads/tpch_2_17_3/dbgen$ ls *.tblcustomer.tbl nation.tbl partsupp.tbl region.tbllineitem.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);
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 ;
修改的地方有第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 '|\n';
这句命令将/home/hadoop/Downloads/tpch_2_17_3/dbgen/part.tbl文件里的数据导入到表part中,可以使用语句select * from part limit 5; 来查看是否导入成功:
结果不为空则导入成功。
这样只是导入了一个表,还要使用相同结构的语句将剩余的7个tbl文件导入到相应的表中。由于外码约束,所以要注意导入文件的先后顺序。
八、参考
1、
2、