一、下载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);