集算器并行处理大文本文件的示例

集算器可以方便地用并行方式处理大文本文件,下面通过一个例子来说明使用方法。

假设有个一千万条销售记录的文本文件sales.txt,其主要字段是SellerID(销售员)、OrderDate(订单日期)、Amount(订单金额),请计算每个销售员在近四年里的大订单总金额。其中,金额在2000以上的属于大订单。

要进行并行处理,首先要能对文件进行分段,集算器提供了游标数据对象cursor及其函数,可以方便地分段读取大文本文件。比如file(“e:/sales.txt”)[email protected](;,3:24),这表示将文件按字节数大致均分为24段,然后读取其中第3段。简单的按字节拆分文件时会产生半行数据即半条记录的情况,还需要再编程处理才行,而如果按行拆分则需要遍历前面所有的数据行,完全达不到采用分段并行方案期望的高性能。集算器在拆分文件时自动进行了去头补尾的工作,保证数据的正确性。

分段后只要进行简单的并行处理就可以了,代码如下:

    主程序

                            

A1:并行任务数设为24,即将文件分为24段。

A2:调用子程序进行多线程并行计算,任务参数有两个:to(A1)、A1。to(A1)的值是[1,2,3…24],这表示每个任务分配到的段数;A1是总段数。所有任务都结束后,计算结果会统一存储在本单元格。

A3:对A2中各任务的计算结果按照SellerId归并。

A4:对归并结果进行分组汇总,求得每个销售员的销售额。

    子程序

其中segment和total是子程序的参数,分别表示当前段和总段数,比如第3个任务,segment参数的值就是3,total的值恒为24。

A1:用游标读取文件,按照主程序传来的参数决定当前任务应该处理文件中的第几段。

A2:选出时间是2011年之后的,订单金额在2000以上的记录。

A3:对过滤后的数据进行分组汇总。

A4:将本任务的计算结果返回主程序。

    代码说明

对于N核CPU,似乎设置为N个任务更加自然,但事实上执行任务时时总会有快有慢(比如过滤出的数据不同),因此常会遇到这种情况:其他核心已经完成了较快的任务,正在空闲等待,而个别核心还在执行较慢的任务。相反,如果每个核心依次执行多个任务,则快慢任务会趋于平均,整体运行会更加稳定。所以上述例子是将任务分为24份,并分给CPU的8个核心进行处理(同时最多允许并行多少个线程可以在集算器的环境中配置)。当然,任务分得太多也会带来坏处,首先是整体性能会下降,其次是各任务产生的计算结果加起来会更大,会占用更多的内存。

callx将复杂的多线程计算封装了起来,程序员可以专心于业务算法,而不必纠结于复杂的信号量控制,开发过程变简单了。

主程序中A3的计算结果已经按照SellerId自动排序,因此A4的分组汇总不必再排序,groups的函数选项@o可以实现免排序的高效分组汇总。

    扩展:

有时候文本文件的数据量会达到几个TB,此时就需要使用基于集群的多节点并行计算。集算器游标及其相关函数支持廉价横向扩展和分布式文件系统,可以轻松实现并行计算。针对本例,只需要在主程序中的A2格加入节点列表即可,形如:=callx("sub.dfx", to(A1), A1;["192.168.1.200:8281","192.168.1.201:8281",”......”]).

时间: 2024-10-11 22:32:35

集算器并行处理大文本文件的示例的相关文章

报表工具的二次革命之集算器的作用

之前的文章已经大致给大家介绍过大数据计算引擎-润乾集算器了.想必很多人心里还是存在疑惑,集算器作为大数据分析系统,到底它能做些什么?这篇文章,就为大家详细介绍. 降低报表开发难度 降低开发难度从而提高开发效率是集算器的设计初衷,是最容易理解的作用,前面已有粗略介绍. 这方面的细节内容太多,我们会再做一个专门话题详细讲述集算器如何解决报表开发中的各种具体难题以及与常规手段的对比.在这里只做总结性地阐述. 比Java和SQL更易写 如前所述,集算器的设计目标是为了解决报表的数据准备,而目前这个工作一

集算器访问HTTP数据的代码示例

使用集算器(esProc)可以很方便的从http数据源读取数据进行处理. 本例子中有一个servlet,对外提供json格式的雇员信息查询.Servlet访问数据库的员工表,保存了员工的信息,如下: EID   NAME       SURNAME        GENDER  STATE        BIRTHDAY        HIREDATE         DEPT         SALARY 1       Rebecca   Moore      F       Califor

集算器读写EXCEL文件的代码示例

集算器可以方便地读写Excel文件,下面用一个例子进行说明:     描述:从data.xlsx读取订单数据和销售员列表,根据这两个sheet计算各部门的销售额,计算结果写入result.xlsx.     源Excel文件:data.xlsx有两个sheet,其中订单数据如下: 销售员列表如下:     集算器代码: A1-A2:从excel文件data.xlsx分别读取第1和第2个sheet,以序表的形式存储在A1.A2格,即订单数据和销售员列表. A3-A4:先将订单数据和销售员列表按照员

集算器实现外键功能的代码示例

如果字段或字段组合k是表M的主键,而k也同时存在于表B,则k就是B的外键.外键维系着表之间的关联关系,是结构化数据计算最重要的概念之一.集算器可以通过对象引用方便地实现外键功能,下面用几个例子来说明:    例1 关联主子表1:    订单表(order)是子表,员工表(emp)是主表,请将emp关联到order中,显示emp中的Name.Gender.Salary字段以及order中的OrderID,Amount字段. 说明:本例只用到emp和order,之后的例子还要用到部门表(dep),三

集算器调用数据库存储过程的代码示例

集算器可以方便的调用数据库的存储过程,这里通过例子来看一下具体的程序写法. 调用无返回值的存储过程 用oracle的存储过程为例,存储过程只有一个输入参数,没有输出参数: create orreplace procedure pro1 (pid IN VARCHAR) as begin insert into emp values(pid,'mike'); update emp set name='rose' where id=pid; commit; end; 在集算器中可以使用execute

润乾集算报表从集算器获得多个结果集的示例

集算器可以为集算报表输出多个结果集,供报表使用.这里通过一个实例说明. 报表说明 根据学生成绩表查询总成绩前三名和后三名的学生姓名以及总成绩.报表样式如下: 由于要分别显示前三名和后三名学生姓名和成绩,报表自然地分成了两部分.这两部分数据如果使用一个数据集会需要隐藏格辅助,使用两个数据集则比较简单,一个数据集基于原始数据进行分组汇总.按总成绩降序排序后取前三名,第二个数据集按升序取前三名.但这个过程用SQL去写会发生重复计算(分组汇总和排序),通过集算器则不会有这个问题,且可以一次为集算报表返回

集算器管理数据库事务的代码示例

集算器可以向数据库写入数据,支持数据库事务管理.这里通过例子来看一下控制事务提交和回滚等等的编程方法. 1.自动提交事务 集算器可以方便的实现增删改,最简单的写法如下: 上图中的A2到A4分别实现了插入.修改和删除.每条sql执行之后自动提交.需要说明的是: 1.3条语句提交了3次,对数据库操作比较频繁. 2.三条sql没有事务关系,后续的sql如果执行失败,并不影响前面的sql. 下面介绍结合序表批量提交事务,以及多条sql组成一个事务的编程例子.     2.批量提交事务 从students

集算器实现几种常见内存分组的代码示例

集算器可以很方便地实现常见的几种内存分组,比如等值分组.对位分组.枚举分组,下面用相应的例子来说明. 等值分组 等值分组的分组依据是本数据集的字段(或字段派生的计算列),每个组都是原数据集的子集. 例子描述:将销售订单按照订单年份进行分组. 数据描述:订单数据如下: 上述数据集(序表)可以从数据库或文件读入,比如: A1=file("E:/sales.txt")[email protected]() 集算器代码 A2=A1.group(year(OrderDate)) 计算结果 代码解

用集算器协助Java读入文本

JAVA提供了最基本的文件处理函数,可以简单无结构的方式读入小文本文件,如果遇到需要结构化.格式多样.要求特殊的文件或内存装不下的大文件,相应的代码就会很复杂,可读性和复用性也很难保障. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和计算函数,并提供JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果.详情参考集算器用作Java计算类库的应用结构. 下面说明JAVA读入文本的常见案例,以及集算器对应的解法. 读入指定列