编程-TPCH数据生成

从官网https://www.tpc.org/information/who/whoweare5.asp找到下载页面,输入一些信息和邮箱之后就可以从邮箱获取下载链接了。下载完解压的东西如下图所示:

image-20220530152601273

首先进入到dbgen文件夹,这是用来生成database的目录,打开makefile.suite文件,找到这个地方:

image-20220530152914795

填写以下的信息:

1
2
3
4
5
6
7
8
9
CC      = GCC
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
# SQLSERVER, SYBASE, ORACLE
# Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS,
# SGI, SUN, U2200, VMS, LINUX, WIN32
# Current values for WORKLOAD are: TPCH
DATABASE= SQLSERVER
MACHINE = LINUX
WORKLOAD = TPCH

注意,虽然咱们是MacOS,但是里面的Machine选项还是填写LINUX。一般网上说直接make就好了,但是出现以下错误:

image-20220531145736637

要解决这个问题,需要把makefile.suite重命名成makefile,就可以。接下来主要输入两个命令:

1
2
make
./dbgen -s 1 -f

首先输入make进行编译,编译的过程会碰到这么个问题:

image-20220530155153607

上面说bm_utils.c这个文件里面找不到malloc.h,网上查了一下,是mac平台下这个文件在sys目录下,这个对应的代码改成:

1
2
#include <malloc.h> 			//错误
#include <sys/malloc.h> //正确

相同的错误按照这个方法改就行。然后就可以用第二个命令生成1G的文件。一共会生成8张数据表,如下图所示:

image-20220531150253491

生成的数据就在dbgen文件目录下。到此,数据就生成完毕了。数据表的信息在其技术文档中有描述。为了使用pyspark读取方便,需要在每个数据文件的第一行加上表头,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# customer
c_custkey|c_name|c_address|c_nationkey|c_phone|c_acctbal|c_mktsegment|c_comment|c_useless

# lineitem
l_orderkey|l_partkey|l_suppkey|l_linenumber|l_quantity|l_extendedprice|l_discount|l_tax|l_returnflag|l_linestatus|l_shipdate|l_commitdate|l_receipdate|l_shipinstruct|l_shipmode|l_comment|l_useless

# nation
n_nationkey|n_name|n_regionkey|n_comment|n_useless

# orders
o_orderkey|o_custkey|o_orderstatus|o_totalprice|o_orderdate|o_orderpriority|o_clerk|o_shippriority|o_comment|o_useless

# part
p_partkey|p_name|p_mfgr|p_brand|p_type|p_size|p_container|p_retailprice|p_comment|p_useless

# partsupp
ps_partkey|ps_suppkey|ps_availqty|ps_supplycost|ps_comment|ps_useless

# region
r_regionkey|r_name|r_comment|r_useless

# supplier
s_suppkey|s_name|s_address|s_nationkey|s_phone|s_acctbal|s_comment|s_useless

采用pyspark,可以用这个方式读取:

1
2
3
4
5
6
7
8
9
10
11
12
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

df_customer = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/customer.tbl")
df_lineitem = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/lineitem.tbl")
df_nation = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/nation.tbl")
df_orders = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/orders.tbl")
df_part = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/part.tbl")
df_partsupp = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/partsupp.tbl")
df_region = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/region.tbl")
df_supplier = spark.read.options(header='True', inferScheme='True', delimiter='|').csv("tpch_data/supplier.tbl")
Thanks for rewarding