tpc-h数据导入mysql_在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结构如下图所示:

7e79c25a1a0e66bf7c421184de8a813a.png

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

二、修改makefile.suite

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

hadoop@sench-PC:~/Downloads/tpch_2_17_3/dbgen$ cpmakefile.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 valuesforDATABASE are: INFORMIX, DB2, TDAT (Teradata)

# SQLSERVER, SYBASE, ORACLE, VECTORWISE

# Current valuesforMACHINE are: ATT, DOS, HP, IBM, ICL, MVS,

# SGI, SUN, U2200, VMS, LINUX, WIN32

# Current valuesforWORKLOAD 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如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 --Sccsid: @(#)dss.ri 2.1.8.1

2 --tpch Benchmark Version 8.0

3

4 usetpch;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 TABLEtpch.REGION18 ADD PRIMARY KEY(R_REGIONKEY);19

20 --For table NATION

21 ALTER TABLEtpch.NATION22 ADD PRIMARY KEY(N_NATIONKEY);23

24 ALTER TABLEtpch.NATION25 ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) referencestpch.REGION(R_REGIONKEY);26

27 COMMIT WORK;28

29 --For table PART

30 ALTER TABLEtpch.PART31 ADD PRIMARY KEY(P_PARTKEY);32

33 COMMIT WORK;34

35 --For table SUPPLIER

36 ALTER TABLEtpch.SUPPLIER37 ADD PRIMARY KEY(S_SUPPKEY);38

39 ALTER TABLEtpch.SUPPLIER40 ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) referencestpch.NATION(N_NATIONKEY);41

42 COMMIT WORK;43

44 --For table PARTSUPP

45 ALTER TABLEtpch.PARTSUPP46 ADD PRIMARY KEY(PS_PARTKEY,PS_SUPPKEY);47

48 COMMIT WORK;49

50 --For table CUSTOMER

51 ALTER TABLEtpch.CUSTOMER52 ADD PRIMARY KEY(C_CUSTKEY);53

54 ALTER TABLEtpch.CUSTOMER55 ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) referencestpch.NATION(N_NATIONKEY);56

57 COMMIT WORK;58

59 --For table LINEITEM

60 ALTER TABLEtpch.LINEITEM61 ADD PRIMARY KEY(L_ORDERKEY,L_LINENUMBER);62

63 COMMIT WORK;64

65 --For table ORDERS

66 ALTER TABLEtpch.ORDERS67 ADD PRIMARY KEY(O_ORDERKEY);68

69 COMMIT WORK;70

71 --For table PARTSUPP

72 ALTER TABLEtpch.PARTSUPP73 ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) referencestpch.SUPPLIER(S_SUPPKEY);74

75 COMMIT WORK;76

77 ALTER TABLEtpch.PARTSUPP78 ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) referencestpch.PART(P_PARTKEY);79

80 COMMIT WORK;81

82 --For table ORDERS

83 ALTER TABLEtpch.ORDERS84 ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) referencestpch.CUSTOMER(C_CUSTKEY);85

86 COMMIT WORK;87

88 --For table LINEITEM

89 ALTER TABLEtpch.LINEITEM90 ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) referencestpch.ORDERS(O_ORDERKEY);91

92 COMMIT WORK;93

94 ALTER TABLEtpch.LINEITEM95 ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references

96 tpch.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);97

98 COMMIT WORK;99

100 usetpch;101

102 alter table CUSTOMER rename tocustomer ;103 alter table LINEITEM rename tolineitem ;104 alter table NATION rename tonation ;105 alter table ORDERS rename toorders ;106 alter table PART rename topart ;107 alter table PARTSUPP rename topartsupp ;108 alter table REGION rename toregion ;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的数据库:

2ad90444f98e0485f788c03148f32742.png

接着执行:

mysql>use tpch;

mysql> show tables;

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

355016a20bf6c435d846d1a3b8620654.png

然后执行:

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

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

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

f7c17a270724b9046b6a603d8b895b03.png

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

522285258255df11e6d04c4ddd60a01d.png

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

七、导入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; 来查看是否导入成功:

275576300274a732610bb87db2b9e0a6.png

结果不为空则导入成功。

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

八、参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值