? ?在前文中我们介绍了文件并行的查找与过滤的实现方法,这里再介绍一下查找过滤加分组汇总的做法。和上一篇一样,这里只讨论小结果集,也就是计算结果在内存中可以装下的情况。
???????? 用多线程实现查找过滤和分组汇总的思路是:采用多线程方式,每个线程处理一部分数据的查找过滤和分组汇总,最后将每一部分检索的结果合并分组汇总,再在主程序中完成最终的过滤。这里通过一个例子来看一下具体做法。
考虑到大数据一般都存储在文件中,这里也以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的方法参见集算器的教程。
采用集算器多线程查找过滤方案的性能测试数据,可参见集算器文件遍历计算的性能测试。?
原文:http://datamachine.iteye.com/blog/2244416