用 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 时,生成的文件中第一行为列名称,否则文件中没有列名称,只有数据:
这个好👍 ,小白要去搞 TPCH 数据不知道从哪里去弄,网上一堆教程,看上去门槛挺高的,这这那那的望而却步,不敢尝试。
代码中 A9 格的路径能不能换个写法,不要硬编码?filename@spd()跟随脚本文件位置,或者 filename@p() 跟随主路径。
B3 格按照建议处理了,感谢建议:)
谢谢大佬,有了 scale factor 就更加贴心了👍
不要说 C 语言编译了 (光看名字就唬住小白了),官网上的工具都下载不下来,第一步就难住了😂
B3 处的路径我觉得把 "\\“写成这个斜杠”/" 普适性会好一些,为啥:
因为 Mac 系统里的路径只认 "/Users/xxx/tpch/“这样的形式,如果是”/Users/xxx\tpch" 这样就不行了,"xxx\tpch" 不会识别成路径。
而在 Win 系统里写成 "E:\xxx\tpch" 或者 "E:\xxx/tpch/" 均可。
以上供参考。
按照蒋总的指导,代码又优化了一遍,路径斜杠也一并修改了🙏
谢谢大佬,谢谢老贼👍 👍
我从网上其它途径搞到了一个 tpch-tool,大概 27 兆,可以在以下百度网盘中获取:
链接: https://pan.baidu.com/s/1TdOOtdBqtPMLEVaHnXwsvw?pwd=spl6
提取码: spl6
WIN 系统里我没玩成功,说是要用 Visual Studio 编译 tpch.sln 这个文件,用于生成 dbgen.exe,一直报错。各种下载资源,干脆就放弃了。
在 Mac 系统里可以按以下步骤生成 TPCH 数据,本机亲测成功:
1、下载上述工具后,解压,然后一直点击进入 dbgen 文件夹;
2、Mac 系统里在 make 编译之前,要先修改 3 处文件,否则会报错
a. 右键 - 打开方式 - 文本编辑打开 "bm_utils.c",找到 "#include <malloc.h>“,把它修改成”#include <sys/malloc.h>“;
b. 右键 - 打开方式 - 文本编辑打开 "varsub.c”,找到"#include <malloc.h>“,把它修改成”#include <sys/malloc.h>“;
c. 右键 - 打开方式 - 文本编辑打开 "makefile.suite”,找到以下部分,
把 CC = DATABASE = MACHINE = WORKLOAD = 改成如下所示:
3、退回上一级目录,也就是 dbgen 文件夹所在的目录,右键 dbgen 文件夹 - 服务 - 新建位于文件夹位置的终端窗口
4、输入命令 make -f makefile.suite 回车,等待执行结束
5、输入命令 ./dbgen -s 1 -f 回车 (-s 1 是数字 1,表示 1G,也可以是其它数字),等待生成数据
6、结束后可以在 dbgen 文件夹里找到 8 个后缀是 tbl 的文件。
以上方法仅供参考🙏
英文版
性能优化案例课程 TPCH-Q1 - 乾学院 (raqsoft.com.cn)
我根据本贴的文件生成好了 tbl 文件以后,lineitem 的文件过大我就复制黏贴了前面几十行的内容,新建了一个 txt 黏贴进去,另存为 tbl 格式,然后按照上文这个链接里的内容进行练习的时候,报错字符串不能和整数计算,请问是生成的 tbl 不能这样复制出来操作吗?还是生成的 tbl 有点不对?lineitem.tbl
带标题行的数据,按照不带处理,第一行是字符串,后面是整数,就会报错了。
前几天在 C1 格增加了 withTitle=true/false 的设置,然后根据具体测试示例的要求,生成带标题行 / 不带标题行的数据。