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

操作主要在文件夹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的数据库:

接着执行:
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、http://www.cnblogs.com/joyeecheung/p/3599698.html
2、http://imysql.com/2012/12/21/tpch-for-mysql-manual.html
在Linux下将TPC-H数据导入到MySQL的更多相关文章
- Linux下mongodb安装及数据导入导出教程
Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...
- Linux下Rsync+sersync实现数据实时同步
inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一. ...
- Linux下Rsync+Inotify-tools实现数据实时同步
Linux下Rsync+Inotify-tools实现数据实时同步 注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件 ...
- 将excel数据导入到mysql的方法
文本框被键盘遮挡到了,不会再获取焦点的时候被顶到键盘顶部.解决方案:设置A的Position为绝对定位absolute即可,其他几种定位方式未测试,但是不能是fixed ,正是因为这种定位方式,导致它 ...
- talend 将hbase中数据导入到mysql中
首先,解决talend连接hbase的问题: 公司使用的机器是HDP2.2的机器,上面配置好Hbase服务,在集群的/etc/hbase/conf/hbase-site.xml下,有如下配置: < ...
- SQLSERVER数据导入到MYSQL
SQLSERVER数据导入到MYSQL http://hi.baidu.com/luck001221/item/cb4462299f9ea79ab73263d2?qq-pf-to=pcqq.group ...
- shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中
shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...
- 使用Python将Excel中的数据导入到MySQL
使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...
- 用JDBC把Excel中的数据导入到Mysql数据库中
步骤:0.在Mysql数据库中先建好table 1.从Excel表格读数据 2.用JDBC连接Mysql数据库 3.把读出的数据导入到Mysql数据库的相应表中 其中,步骤0的table我是先在Mys ...
随机推荐
- windows环境下批处理实现守护进程
这个脚本提供两种方式守护,一种是通过进程名,但对于进程名都是java.exe的java程序不适用,另一种是通过netstat查找应用程序所监听的端口是否正在被监听.这两种方式可以在脚本中通过两个冒号注 ...
- Jmeter javaRequest插件开发
1. 适用场景 Jmeter工具当前支持的协议或协议所支持的传输方式及传输内容不能满足当前项目的测试要求时,就需要根据实际要求手动编写java测试代码(实现对应的Jmeter规范),以插件方式加载到J ...
- python学习笔记2-tuple
tuple: #元组也是List,但是值不能变 a=(') print(a[1]) mysql=(',''root','123456') print(mysql.count('root')) #例子 ...
- Java实现链式存储的二叉查找树(递归方法)
二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字: 2. 若右子树非空,则右子树上所有节点关键字值 ...
- Spring MVC表单防重复提交
利用Spring MVC的过滤器及token传递验证来实现表单防重复提交. 创建注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RU ...
- slice层解析
如果说之前的Concat是将多个bottom合并成一个top的话,那么这篇博客的slice层则完全相反,是把一个bottom分解成多个top,这带来了一个问题,为什么要这么做呢?为什么要把一个低层的切 ...
- Go语言fmt库的print函数源码解析
// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...
- java 面试题总结(一)
从网上找了些面试题,自己手工总结了理解了一下,如有理解错误,还请指正. java基础 1.String 为什么是final的? https://www.zhihu.com/question/3 ...
- PE文件结构及其加载机制
一.PE文件结构 PE即Portable Executable,是win32环境自身所带的执行体文件格式,其部分特性继承自Unix的COFF(Common Object File Format)文件格 ...
- 42 - 数据库-orm-SQLAlchemy
目录 1 ORM 2 sqlalchemy 3 基本使用 3.1 创建连接 3.1.1 利用连接池执行sql 3.1.2 利用session来执行sql 3.2 创建基类 3.3 创建实体类 3.3. ...