`
datamachine
  • 浏览: 156823 次
社区版块
存档分类
最新评论

文件计算的并行分组汇总

阅读更多

   在前文中我们介绍了文件并行的查找与过滤的实现方法,这里再介绍一下查找过滤加分组汇总的做法。和上一篇一样,这里只讨论小结果集,也就是计算结果在内存中可以装下的情况。

         用多线程实现查找过滤和分组汇总的思路是:采用多线程方式,每个线程处理一部分数据的查找过滤和分组汇总,最后将每一部分检索的结果合并分组汇总,再在主程序中完成最终的过滤。这里通过一个例子来看一下具体做法。

考虑到大数据一般都存储在文件中,这里也以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关键字,使用多线程执行B2B5的代码,线程数是4,每个线程读取到的A2值分别是1234

   B2:利用游标cursor函数,将文件大致分成4组,取其中第A2组的游标(只取需要的字段)。

   B3:按照年份=2013年查找过滤。

   B4:对游标进行分组汇总。

   B5:返回本线程的分组结果B4

   A6:在主线程中把四个线程的返回结果合并。

   A7:对合并之后的结果再做一次分组汇总。

   A8:按照订单金额大于500000过滤分组之后的结果。

   A8,向外部程序返回最终汇总结果。

集算器脚本完成之后保存为group.dfx,在外部程序中通过集算器JDBC调用group.dfx的方法参见集算器的教程。

采用集算器多线程查找过滤方案的性能测试数据,可参见集算器文件遍历计算的性能测试 

  • 大小: 61.9 KB
0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics