文件计算的并行分组汇总
在前文中我们介绍了文件并行的查找与过滤的实现方法,这里再介绍一下查找过滤加分组汇总的做法。和上一篇一样,这里只讨论小结果集,也就是计算结果在内存中可以装下的情况。
用多线程实现查找过滤和分组汇总的思路是:采用多线程方式,每个线程处理一部分数据的查找过滤和分组汇总,最后将每一部分检索的结果合并分组汇总,再在主程序中完成最终的过滤。这里通过一个例子来看一下具体做法。
考虑到大数据一般都存储在文件中,这里也以Orders.b文件为例,数据如下:
ORDERID CLIENT SELLERID AMOUNT ORDERDATE NOTE
1 287 47 5825 2013-05-31 gafcaghafdgie f ci…
2 89 22 8681 2013-05-04 gafcaghafdgie f ci…
3 47 67 7702 2009-11-22 gafcaghafdgie f ci…
4 76 85 8717 2011-12-13 gafcaghafdgie f ci…
5 307 81 8003 2008-06-01 gafcaghafdgie f ci…
6 366 39 6948 2009-09-25 gafcaghafdgie f ci…
7 295 8 1419 2013-11-11 gafcaghafdgie f ci…
8 496 35 6018 2011-02-18 gafcaghafdgie f ci…
9 273 37 9255 2011-05-04 gafcaghafdgie f ci…
10 212 0 2155 2009-03-22 gafcaghafdgie f ci…
…
说明:数据中note字段是为了增加每条记录的长度设置的字段,没有实际意义。
需要将2013年的订单记录按照client,sellerid 分组,并求订单数量count(orderid)和订单金额sum(amount)。最后,按照订单金额大于500000的条件过滤结果。
由于Orders.b的数据量较大,所以分成若干段并行处理。首先,要使用集算器来编写脚本group.dfx,实现多线程计算,具体脚本如下:
A1:并行汇总线程数为4。
A2:通过fork关键字,使用多线程执行B2到B5的代码,线程数是4,每个线程读取到的A2值分别是1、2、3、4。
B2:利用游标cursor函数,将文件大致分成4组,取其中第A2组的游标(只取需要的字段)。
B3:按照年份=2013年查找过滤。
B4:对游标进行分组汇总。
B5:返回本线程的分组结果B4。
A6:在主线程中把四个线程的返回结果合并。
A7:对合并之后的结果再做一次分组汇总。
A8:按照订单金额大于500000过滤分组之后的结果。
A8,向外部程序返回最终汇总结果。
集算器脚本完成之后保存为group.dfx,在外部程序中通过集算器JDBC调用group.dfx的方法参见集算器的教程。
采用集算器多线程查找过滤方案的性能测试数据,可参见集算器文件遍历计算的性能测试。