用 SPL 生成 TPCH 数据

TPC 官网提供了 C 语言生成程序,下载编译后执行,就可以生成 TPCH 数据了。

但是, 很多人对 C 语言及其环境不熟悉,就卡在这一步了。

 

这里按照官方规则,写了一段 SPL 脚本来生成 TPCH 数据,这样,只要安装有集算器就可以方便地生成数据了。

TPCH 有 8 个表,其中 region 表固定有 5 条记录,nation 表固定有 25 条记录,剩余的 6 个表根据 Scale Factor(SF) 确定生成规模,SF=1(即 1G) 时,各表记录数如下:

supplier 表:1 万条;

customer 表:15 万条;

part 表:20 万条;

partsupp 表:80 万条;

orders 表:150 万条;

lineitem 表:600 万条。

SF=n 时,各表规模扩大至 n 倍。

 

生成数据时,不同的字段有不同的生成规则:

主键字段是从 1 开始的自增整数,如 N_NATIONKEY、S_SUPPKEY 等;

名称字段是固定前缀 + 主键序号,如 Supplier#000000001、Customer#000000001;

一些数值字段是在一定范围内随机生成,如 O_TOTALPRICE(857~555285)、L_TAX(0~0.08);

还有一些分类字段在几个状态值中随机,如 L_RETURNFLAG (取值 A/N/R)、L_LINESTATUS (取值 O/F);

订单日期是在 1992~1998 年之间随机某天。

 

除了上面这些简单的规则,还有不同表字段互相关联的规则:

partsupp 表是 part 表数据的 4 倍,每个 part 随机对应 4 个 supplier;

一个订单 (一条 orders 记录) 对应 lineitem 表中 L_LINENUMBER(1~7)个明细,对应 7 种明细的概率分别是[1,0.9,0.8,0.5,0.4,0.3,0.1],这样总体算下来,lineitem 表的条数几乎是 orders 表的 4 倍。

lineitem 表中的 L_SHIPDATE、L_COMMITDATE 要在 orders 表中相关订单日期后的 50 天内随机生成,而 L_RECEIPTDATE 要在 L_SHIPDATE 后的 10 天内随机生成。

 

上面这些规则都在 generateTpchData.splx 中做了实现,可以《下载》 了解详细 SPL 脚本。

执行这个脚本时,可以修改 A1 格子中 SF 的值,改成多少,就会生成多少 GB 的数据;B1 格子指定了生成数据的文件夹目录,默认与脚本文件 generateTpchData.splx 同目录,也可以改为其它绝对路径(如:>tpchFolder=”D:/tpch/”);C1 中 withTitle 为 true 时,生成的文件中第一行为列名称,否则文件中没有列名称,只有数据:
..