一、下载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的更多相关文章

  1. Linux下mongodb安装及数据导入导出教程

    Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...

  2. Linux下Rsync+sersync实现数据实时同步

    inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一. ...

  3. Linux下Rsync+Inotify-tools实现数据实时同步

    Linux下Rsync+Inotify-tools实现数据实时同步 注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件 ...

  4. 将excel数据导入到mysql的方法

    文本框被键盘遮挡到了,不会再获取焦点的时候被顶到键盘顶部.解决方案:设置A的Position为绝对定位absolute即可,其他几种定位方式未测试,但是不能是fixed ,正是因为这种定位方式,导致它 ...

  5. talend 将hbase中数据导入到mysql中

    首先,解决talend连接hbase的问题: 公司使用的机器是HDP2.2的机器,上面配置好Hbase服务,在集群的/etc/hbase/conf/hbase-site.xml下,有如下配置: < ...

  6. SQLSERVER数据导入到MYSQL

    SQLSERVER数据导入到MYSQL http://hi.baidu.com/luck001221/item/cb4462299f9ea79ab73263d2?qq-pf-to=pcqq.group ...

  7. shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中

    shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...

  8. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  9. 用JDBC把Excel中的数据导入到Mysql数据库中

    步骤:0.在Mysql数据库中先建好table 1.从Excel表格读数据 2.用JDBC连接Mysql数据库 3.把读出的数据导入到Mysql数据库的相应表中 其中,步骤0的table我是先在Mys ...

随机推荐

  1. php 中 FastCGI与cgi的关系,何为fastcgi

    FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持 在内存中并因此获得较高的性能.众所周知,CGI解释器的反复加载是CGI性能低下的主要原因, 如果CGI解释器 ...

  2. codevs 2147 数星星

    2147 数星星 http://codevs.cn/problem/2147/ 题目描述 Description 小明是一名天文爱好者,他喜欢晚上看星星.这天,他从淘宝上买下来了一个高级望远镜.他十分 ...

  3. 从零搭建SSM框架(一)搭建工程

    工程结构 一.cnki-parent 1.新建maven project  2.pom.xml <project xmlns="http://maven.apache.org/POM/ ...

  4. 【Hadoop】Win7上搭建Hadoop开发环境,方法一

    在Win7上,编写hadoop程序 操作系统:win7 hadoop版本:CDH3u6 1.下载安装JDK,以及Eclipse 2.新建JAVA Project 3.去cloudera网站下载hado ...

  5. 详细讲解安全升级MySQL的方法

    MySQL升级是非常必要的. 我们在Percona Support上列出了关于MySQL升级最佳实践的各种问题.这篇文章推荐了一些不同情况下升级MySQL的方法. 为什么MySQL升级是必须的? 原因 ...

  6. Nginx配置location及rewrite规则

    Nginx配置location及rewrite规则 示例: location  = / {   # 精确匹配 / ,主机名后面不能带任何字符串   [ configuration A ] } loca ...

  7. python实现梯度下降法

    # coding:utf-8 import numpy as np import matplotlib.pyplot as plt x = np.arange(-5/2,5/2,0.01) y = - ...

  8. 32、TreeSet简介

    使用TreeSet存储Integer对象 TreeSet的特点是可以对存放进去的元素进行排序. package com.sutaoyu.list; import java.util.TreeSet; ...

  9. [转]CNN 中千奇百怪的卷积方式大汇总

    https://www.leiphone.com/news/201709/AzBc9Sg44fs57hyY.html 推荐另一篇很好的总结:变形卷积核.可分离卷积?卷积神经网络中十大拍案叫绝的操作. ...

  10. macOS 安装 pcl 1.8.0

    Mac 上的 pcl 一直有问题. 找不到 pcl_viewer 查看 pcd 文件.写个程序用 pcl::visualization::CloudViewer 查看点云,遇到 Runtime Exc ...