集合相减算法java_集算器协助java处理结构化文本的集合运算

有两个小文件:f1.txt和f2.txt,第一行是列名,现在需要对文件中的Name字段进行交集运算。部分数据如下:

文件f1.txt:

d2f6cc244aa7cf30f3778f6455bc9425.png

文件f2.txt:

09cc888a2ad99b9436c5a24152b2eb6c.png

集算器代码:

ea58ed37af3577366f3ffbac902623c3.png

A1、B1:用import函数将文件读=[A1.(Name),B1.(Name)].isect()入内存,默认的分隔符是tab。这里的函数

选项@t表示将第一行读为列名,这样一来后续的计算就可以直接用Name和Dept来引用相应的列,如果第一行不是列名,则应当用_1和_2这种默认列名

来引用。

计算后A1和B1的值分别如下:

54ae29742ea13e598b523cc1e7d7deb1.png

函数import可以读取指定的列,比如本案例只有Name会参与计算,因此可以只读取Name列,对应的代码是:file(“E:\\f1.txt”).import@t(Name) 。

A2= 函数isect可以进行集合间的交集运算,A1.(Name)表示取出A1的Name列,形成一个集合,B1.(Name)表示取出B1的Name列。本案例的最终结果如下:

08da40b9c1516dd1d06c71ed8f443ace.png

A3:result A2。这表示将计算结果输出到JDBC接口。A3可以和A2合为一步:result [A1.(Name),B1.(Name)].isect() 。

上述是求交集的过程,求并集只需换个函数:[A1.(Name),B1.(Name)].union(),计算结果如下:

1cfe3e5bc3e44abb5c005b40377dbb29.png

求差集的代码:[A1.(Name),B1.(Name)].diff(),计算结果如下:

20bd54f2ca8d09346e4a59efd4a481c0.png

还有一类特殊的集合算法:和集,即求并集时保留重复的元素,和集的代码:[A1.(Name),B1.(Name)].conj(),计算结果如下:

072f5a77f0eb271dca76edfb394739f6.png

可以直接用运算符来代替函数,写法更加简洁,比如交集,并集、差集、合集可以改写为:

A1.(Name) ^ B1.(Name)

A1.(Name) & B1.(Name)

A1.(Name) \ B1.(Name)

A1.(Name) | B1.(Name)

也可以对多个文件进行集合运算,比如f1.txt、f2.txt、f3.txt读入内存后对应的变量分别是A1、B1、C1,对它们求交集,代码如

下:A1.(Name) ^ B1.(Name) ^C1.(Name) 或

[A1.(Name),B1.(Name),C1.(Name)].isect() 。

有时候文件比较大,会影响集合运算的性能,可以用sort函数事先排序,再用merge函数来进行集合运算,这样一来性能会显著提高。其中,求交集时应当使用函数选项@i,并集使用@u,差集使用@d,对应的代码分别如下:

=[A1.(Name).sort(),B1.(Name).sort()].merge@i()

=[A1.(Name).sort(),B1.(Name).sort()].merge@u()

=[A1.(Name).sort(),B1.(Name).sort()].merge@d()

函数merge还可以进行多字段的集合运算,假设不同的Dept会存在相同的Name,现在需要将Dept和Name当作一个整体来进行交集运算,

对应的代码如下:[A1.sort(Dept,Name),B1.sort(Dept,Name)].merge@i(Dept,Name) 。

计算结果如下:

e459f03e186613147ebdd79c69f5d15d.png

对于内存放不下的大文件,可以用cursor函数来读取文件,并用merge函数来实现集合运算。其中,求交集的代码如下:

A1=file(“e:\\f1.txt”).cursor()

B1=file(“e:\\f2.txt”).cursor()

A2=[ A1.sortx(Name),B1.sortx(Name)].merge@xi(Name)

注意,这里函数cursor并不会将数据全部读入内存,而是以游标(或流)的方式打开文件。集算器引擎会自动分配合适的缓冲区,每次读取一部分数据参与计算,再循环往复,完成最终的计算。

与内存计算不同,操作游标需要使用游标函数,比如排序时应当使用函数sortx。这里的merge函数使用了两个函数选项,@i表示求交集,@x表示参与计算的对象不是内存数据,而是游标。另外,union等函数只能进行内存数据的集合运算,不能用于大文件。

上述脚本已经完成了所有的数据处理工作,接下来通过JDBC将集算器脚本集成在JAVA里。JAVA代码如下:

//建立esProc jdbc连接

Class.forName(“com.esproc.jdbc.InternalDriver”);

con= DriverManager.getConnection(“jdbc:esproc:local://”);

//调用esProc,其中test是脚本文件名

st =(com.esproc.jdbc.InternalCStatement)con.prepareCall(“call test()”);

st.execute();//执行esProc存储过程

ResultSet set = st.getResultSet();//获得计算结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

netbeans插件_如何编写NetBeans插件

netbeans插件是否想在NetBeans IDE中添加功能或自动执行某些操作? 跟随我们编写您的第一个NetBeans插件。 让我们超越简单的工具栏示例 ,创建一个可以自动更新的插件。 该代码基于NetBeans的WakaTime插件 。 我们的示例插件将仅打印Hello World语句&…

c语言程序从哪里开始执行

c语言程序的执行总是起始于main函数。在一个C语言源程序中,无论main函数书写在程序的前部,还是后部,程序的执行总是从main函数开始,并且在main函数中结束。但需要注意的是,也是有特殊情况的,若是代码中出现…

基于价值链的流程框架分类_基于价值的类

基于价值链的流程框架分类在Java 8中,某些类在Javadoc中有一个小注释,说明它们是基于值的类 。 其中包括简短说明的链接,以及有关不使用它们的限制。 这很容易被忽略,如果这样做,则可能会在将来的Java版本中以微妙的方…

C语言中数组所占字节怎么算

数组在内存中所占字节数可以使用sizeof操作符来计算,该操作符是专门用于检测类型或变量或数组在内存中所占有的空间(字节数);语法“sizeof(x)”,其中x是类型名、变量名或数组名等,可以返回x所占字节数。C语…

c 中头文件和源文件的区别是什么

区别:头文件是“.h”文件,提供接口;源文件是“.cpp”文件,提供实现。编译器规定源文件必须包含函数入口,即main函数;而头文件不得包含函数入口,头文件不可以单独编译成一个程序,仅仅…

rest api_REST API的演变

rest api每个开发人员都以某种方式接触到API 。 要么为一家大公司集成一个主要系统,或者使用最新的图形库生成一些精美的图表,要么直接与他喜欢的编程语言进行交互。 事实是,API无处不在! 它们实际上代表了当今Internet的基本构建…

在c程序中,注释语句只能位于一条语句的后面吗

C语言中的注释在编写C语言源代码时,应该多使用注释,这样有助于对代码的理解。在C语言中有两种注释方式:一种是以/*开始、以*/结束的块注释(block comment);另一种是以//开始、以换行符结束的单行注释&#…

C 运算符中不能重载的是哪些

C 运算符中不能重载的有:1、条件运算符“?:”;2、成员访问运算符“.”;3、域运算符“::”;4、长度运算符“sizeof”;5、成员指针访问运算符“->*”和“.*” 。重载:让操作符可以有新的语义,…

C语言字符串输出函数puts()的作用是什么

C语言字符串输出函数puts()的作用:puts()在显示字符串时会自动在其末尾添加一个换行符。puts()遇到空字符时就停止输出,所以必须确保有空字符。  下面两个示例分别说明puts()的两个特点。  示例1:/* put_out.c -- using puts() */#includ…

maf中anglearc_Oracle MAF中的LOV

maf中anglearc我们都喜欢最强大的ADF功能值列表之一。 使用它们,我们可以声明并轻松地在ADF应用程序中构建非常复杂的功能。 一件好事是,我们在Oracle MAF中也有类似的方法。 在ADF BC中,我们在业务服务级别(基本上在实体或VO级别…

一个c程序的执行是从哪里开始到哪里结束

一个C程序的执行是从main函数开始到main函数结束。C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语…

java9 coutdown_Java并发之CountDownLatch

正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解…

jsf 写一个action_一个JSF清单示例

jsf 写一个action这是使用JSF 2.0(JavaServer Faces)构建的示例列表应用程序。 该应用程序是待办事项列表。 该应用程序具有添加,编辑或删除列表中项目的功能。 待办事项具有名称和描述属性。 完成的应用程序的JSF页面具有: 使用…

c 中=和==的区别有哪些?

c 中和的区别1、含义不同:“”是赋值的意思。它的作用是将一个表达式的值赋给一个左值。一个表达式或者是一个左值,或者是一个右值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量。我们用变量作左值&#xff…

java内部格式_详解java内部类的访问格式和规则

详解java内部类的访问格式和规则1.内部类的定义定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述。2.内部类访问规则①内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员&#xf…

primefaces_使用WildFly 8.2.0.Final,Primefaces 5.1和MySQL 5的JDBC领域和基于表单的身份验证...

primefaces我会不时查看我博客上最受欢迎的内容,并尝试最好地满足您的需求。 因此,阅读我的博客是其他读者推动内容的一种方式。 另一种方法是通过评论或电子邮件与我联系。 今天,我将使用Primefaces修改我的JDBC Realm示例并将其更新到最新的…

c语言语句以什么结束

c语言源程序的每一条语句都英文输入状态下的“;”结束一条语句。不同的版编权程语言有不同的结束标志,Java,C 也是以“;”作为一行语句的结束的标志,也有不需要用“;”作为一行语句结束的编程语言&#xff…

hadoop lambda_Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm

hadoop lambda最近,一群人要求我详细介绍我为我们的书《分布式实时计算的风暴蓝图》撰写的Druid / Storm集成。 德鲁伊很棒。 风暴很棒。 两者一起解决了实时维查询/聚合问题。 实际上,人们正在将其视为主流,称其为RAD Stack ,并…

C语言中sizeof和strlen的区别是什么

C语言中sizeof和strlen的区别是:strlen是一个函数,用来计算指定字符串str的长度,但不包括结束字符(即null字符);而sizeof是一个单目运算符,不是函数。区别分析:strlen 是一个函数&am…

c语言中continue语句的作用是什么

continue 的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定。注意:continue 语句只结束本次循环,而不是终止整个循环。continue 只能在循环语句中使用,即只能在 for、while 和…