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

集算器可以很方便地实现常见的几种内存分组,比如等值分组、对位分组、枚举分组,下面用相应的例子来说明。

等值分组

等值分组的分组依据是本数据集的字段(或字段派生的计算列),每个组都是原数据集的子集。

例子描述:将销售订单按照订单年份进行分组。

数据描述:订单数据如下:

上述数据集(序表)可以从数据库或文件读入,比如:

A1=file("E:/sales.txt")[email protected]()

集算器代码

A2=A1.group(year(OrderDate))

计算结果

代码解读

  1. 本例中,分组依据来自于订单日期(OrderDate),通过year(OrderDate)可以将订单日期计算成年份,分组后每一年的数据归为一组。
  2. 分组字段可以是多个。比如重新按照年份、销售员分组,将不同年份不同销售员的数据归为一组,代码如下:

A1.group(year(OrderDate),SellerId)

3.  分组后的数据经常要进行聚合运算,比如根据A2计算出每年的销售额,代码如下:

A2.new(year(OrderDate):y,~.sum(Amount):a)

计算结果是:

也可以将分组和汇总这两步用一个groups函数来实现:

A1.groups(year(OrderDate):y;sum(Amount):a)

当然,有时为了代码重用和提高计算效率,我们不得不把分组和汇总分开,比如对A2的其中一个组进行过滤,另一个组进行关联计算。再比如:汇总后发现某个分组的数据比较异常,值得深入研究,此时就可以利用原分组继续进行计算,而不是重新过滤出这个组的数据。

4.  缺省情况下,集算器的group函数将使用hash算法对数据分组,但对于已经有序的数据,使用相邻比对的方案会有更高性能,在group函数中使用@o选项可以实现这种分组方案,如:

[email protected](year(OrderDate),SellerId)

对位分组

等值分组的分组依据来自于本数据集的字段,但有时分组依据会来自于外部,比如其他数据集的字段、用户构造的数组、参数列表等,这种分组方式就是对位分组。

与等值分组不同,对位分组可能出现空子集,即没有任何成员与某个分组条目对应。而且还可能出现不完全分组,即有成员不出现在任何分组中。而等值分组是不可能出现这种情况的。

例子描述:已经计算出了绩效成绩前十的销售员列表,请按照该列表的顺序对订单进行分组。

分组前数据集

订单沿用上一个例子,数据存储于A1中。

绩效成绩前十的销售员,该列表存储于B1中,如下:

销售员列表可以来自于中间表,也可以由一段代码计算生成,它的产生过程不是例子的重点。

集算器代码

[email protected](B1:empID,SellerId)

计算结果

代码解读

  1. 本例中,分组依据(销售员列表)来自于被分组的数据集之外,分组后每个销售员的数据归为一组,组之间按照分组依据进行排列。
  2. 订单中的销售员要比列表中的多,这就会导致一部分订单不会出现在任何一个组,如果想把这些订单多分一组,可以使用函数选项@n,如下:

[email protected]@n(B1:empID,SellerId)

多分的一组会排在最后,如下:

3.  有时候分组依据不在被分组的数据集中,比如分组依据是“新上岗的销售员列表”。这种情况下会使结果出现空组,这是正常的。比如把列表中的第一条改为empID=100,计算结果会是这样:

枚举分组

枚举分组的分组依据更加灵活,可以是任意的布尔表达式,符合表达式的记录会归为相同的一组。

与对位分组类似,枚举分组也是不完全分组,可能出现空子集或成员不属于任何分组的情况,而且,枚举分组可能出现成员重复地属于多个分组的情况。

例子描述:将订单分为四组,分别是:A.订单金额小于1000的,B.金额小于2000之间的,C.金额在小于3000的,D.金额小于10000的。特别要求:数据不能重复分组,即如果某个订单已经属于前面的A组,则不能再将它分到后面的B、C、D组。

分组前数据集

订单沿用上一个例子,数据存储于A1中。

集算器代码

A2=["?<=1000","?<=2000","?<=3000","?<=10000"]

A3=A1.enum(A2,Amount)

计算结果

代码解读:

  1. 在本例中,分组依据是多个灵活的表达式。每条记录都会和表达式进行匹配,如果符合表达式,这条记录就会成为该组成员。同样的,组之间按照分组依据的顺序进行排列。
  2. 默认情况下,enum的分组结果是不会产生重复的,即分完A组的数据后,将从剩余的数据中判断是否符合表达B,上述例子就是这种分组方式。如果使用函数选项@r,则表示从全部的数据中判断是否符合表达式B,这就会产生重复的分组结果。比如:[email protected](A2,Amount),计算结果是:


3.  和对位分组类似,如果枚举表达式超出了待分组数据的范围,则该组为空。此外,有些数据不符合任何一个表达式,此时可以用@n函数选项把这些记录归为多余的一组。

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

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

集算器是什么?

集算器是一种程序设计语言,专注于(半)结构化数据计算与处理,提供了丰富的此类运算的类库.集算器不是面向对象的程序设计语言,没有复杂的继承和重载概念,引入对象概念仅仅是为了更方便地描述与对象相关的方法,有BASIC这类初级程序设计水平的程序员都能很快掌握.集算器是基于Java解释执行的动态语言,可以在运行过程中拼出代码执行,这样可以获得更大的灵活性,进一步降低程序设计的复杂度. 集算器定位为(半)结构化数据处理,没有直接提供统计分析.数据挖掘和机器学习等算法,也不擅长处理媒体和地图类数据. 与Ja

集算器协助java处理结构化文本之数据读入

JAVA只提供了指定分割符等最基本的数据读入功能,而其他常见功能都需要自己从底层去实现,比如:按列名读入指定列.指定列的次序.指定数据类型.无分割符等等.JAVA实现这类功能虽然不难,但代码很繁琐,很容易出错. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件data.txt是tab分割的文本文件,有30个列,第一行是具有业务意义的列名,现在需要按列名读入这几列:ID.x1Shift.x2Shift.radio,并按业务公式“((x1Sh

集算器JDBC的集成与使用方法

集算器JDBC 类似一个不完整的数据库JDBC驱动,它不带物理表,可将集算器视为只有存储过程的数据库(较强的计算能力,较弱的存储机制).与使用数据库JDBC非常类似,可以像调用存储过程一样调用集算器程序.不同的是,集算器JDBC是个完全嵌入式计算引擎,所有运算都在这个嵌入包中完成,而不象数据库那样还有一个独立的服务器来实施计算. 1.加载驱动jar 集算器JDBC所需jar包括:dm.jar.poi-3.7-20101029.jar.log4j_128.jar.icu4j_3_4_5.jar.d

用集算器实现跨数据库关联报表

实际应用中很多报表的数据来源于多个不同类型的数据库,报表数据源跨数据库是报表开发中的常态.目前实现这类跨库关联报表的方式有多种,但都会存在这样那样的问题. 使用报表工具自身多源关联功能 现在大多数主流报表工具都支持多数据源关联,这在某些方面确实为报表用户带来了便利.然而我们也经常会遇到通过报表自身的多源关联功能很难实现一些跨库关联的报表(由于数据结构和业务本身决定).这当然容易理解,报表工具主要是来做数据展现的,而对数据计算本身来说并不擅长. 即使有的能实现,在报表中做跨库关联计算的效率也较低,

集算器如何处理文本计算难题

文本可以说是除了数据库外几乎最常见的数据存储形式,针对文本的计算非常重要.然而文本本身没有计算能力,不象数据库有SQL语法,这样对文本的计算就需要借助程序设计语言编码,而大多数用于文本处理的程序语言都没有集合化的,编写批量运算时很繁琐.比如用Java写个很简单地求和运算就要很多行,如果涉及到过滤分组这种运算就需要几百行代码.近年来新出来的perl,python,R等脚本语言在这些方面有所改善,但对批量结构化计算的支持仍然不足,而且集成性也较差. 还有一种方案是将文本数据导入数据库再利用SQL计算

用集算器实现跨行组计算报表

跨行组计算类报表在报表开发中非常常见,如常见的同期比.环比计算.移动平均值计算等.这类报表由于经常要引用其他行列的数据进行相对/绝对位置运算,使得报表工具在实现时并不轻松.功能相对强大的润乾报表需要借助层次坐标和位移坐标,辅以条件表达式和"$"运算符完成,书写和理解都有相当的难度. 其实通过集算器这类报表则非常容易实现,我们来看一个例子.     报表需求:根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比,样式如下: 这里应该注意的是比去年同期是指

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

用集算器协助Java读入文本

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

集算器如何优化复杂报表计算(2)格式布局及过程计算

布局格式 横向分栏 大多数报表工具都支持纵向分栏,但几乎没有报表工具支持横向分栏,我们可以用集算器把数据集事先摆好. A B C 1 =db.query("select a,b,c from T ") 2 =A1.step(3,1) =A1.step(3,2)|[null] =A1.step(3,3)|[null] 3 =A2.derive(B2(#).a:a2,B2(#).b:b2,B2(#).c:c2,C2(#).a:a3,C2(#).b:b3,C2(#).c:c3) 这段代码将3