既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果用整数的二进制位来存储二值标签(0,1 各代表一个取值),那么 16 位短整数就能存 16 个标签,100 个整型字段就能存 1600 个标签,可以有效减少字段数量,避免大表连接。
但是,很多数据库还不支持这种位相关的计算,也就不能实现这种性能优化方法。
开源数据计算引擎 SPL支持序号引用和位式运算,可以很方便地实现上述优化方法。相应的SPL代码也很简单,例如原数据表T_ordinary中的字段包括:用户id、枚举标签字段dName(比如年龄段:children、juvenile、youth、middle age、old age)、16个布尔标签字段flag1到flag16,以及金额字段amt。其中,dName的取值范围在选项表dim中。下面的代码可以完成序号引用和位式存储的转换:
A | |
1 | =file(“T_ordinary.ctx”).open().cursor(id,dName,flag1,flag2,…,flag16,amt) |
2 | =T(“dim.btx”) |
3 | =A1.new(id,dim.pos@b(dName):d,bits(flag1,flag2,…,flag16):b,amt) |
4 | =file(“T.ctx”).create(id,d,b,amt) |
5 | =A4.append(A3) |
A3用pos函数将dName的值替换为dim中的序号,存成新字段d。dim预先按照 dName有序,这里用二分法查找速度更快。同时使用 bits 函数把 16 个标签字段转换成一个16位整数字段b。
转换好的表T就可以做高性能的标签过滤和统计了。例如,过滤条件是dName取值在前端传入的集合[“middle age”,“old age”]中,且标签 flag4、flag8 为 1。 完成过滤之后,按照d分组汇总金额和记录数,代码大致是这样的:
A | |
1 | =bits(0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0) |
2 | =T(“dim.btx”).([“middle age”,“old age”].contain@b(~)) |
3 | =file(“T.ctx”).open().cursor(amt;A2(d) && and(b,A1)==A1) |
4 | =A3.groups(d;sum(amt),count(~)) |
A1用bits函数生成16位小整数,第4、8位值是1,对应标签 flag4、flag8。A2生成布尔值集合。A3利用布尔值集合和小整数做过滤计算。
在使用SPL的虚表后,还可以把这些变换过的字段透明化,直接像普通字段一样使用。比如:基于表T定义虚表T_pseudo后,上述代码大致会变成这样:
A | |
1 | =T_pseudo.select(flag4 && flag8 && [“middle age”,“old age”].contain@b(dName)) |
2 | =A3.groups(dName;sum(amt),count(~)) |
flag4、flag8是虚表中定义的位维度字段,对应T表中b字段的第4、8位。dName则是虚表中的枚举维度字段,其值是T表中的d字段序号对应的名称。
有了虚表后,实际的存储和计算方法不变,SPL会自动完成上述算法。而且,过滤条件中可以使用普通的布尔值,结果集中分组值也会变成容易阅读的字符串,不必再做序号和名称的转换。虚表的具体使用方法参见SPL 虚表的数据类型优化。
SPL资料
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
讲解视频,并且后续会持续更新**