一、下載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;\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 *.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);
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文件導入到相應的表中。由於外碼約束,所以要注意導入文件的先后順序。
八、參考
