> Java > java지도 시간 > 본문

Java 구조화된 데이터 처리 오픈 소스 라이브러리 SPL을 이해해 보세요.

WBOY
풀어 주다: 2022-05-24 21:08:07
앞으로
1997명이 탐색했습니다.

이 기사는 구조적 데이터 처리 오픈 소스 라이브러리 SPL과 관련된 문제를 주로 소개하는 java에 대한 관련 지식을 제공합니다. Java에서 이상적인 구조적 데이터 처리 라이브러리를 살펴보겠습니다.

Java 구조화된 데이터 처리 오픈 소스 라이브러리 SPL을 이해해 보세요.

추천 연구: "java 비디오 튜토리얼"

현대 Java 애플리케이션 아키텍처는 Fiery 마이크로서비스와 같이 더 나은 유지 관리성, 확장성 및 이식성을 얻기 위해 데이터 저장과 처리의 분리를 점점 더 강조하고 있습니다. 이 아키텍처에서는 일반적으로 비즈니스 로직을 기존 애플리케이션 아키텍처처럼 데이터베이스에 배치하는 대신 Java 프로그램에서 구현해야 합니다.

애플리케이션의 비즈니스 로직 대부분은 구조화된 데이터 처리와 관련됩니다. 데이터베이스(SQL)는 이러한 작업을 풍부하게 지원하며 비즈니스 로직을 비교적 쉽게 구현할 수 있습니다. 그러나 Java에는 항상 이러한 기본 지원이 부족하여 Java에서 비즈니스 로직을 구현하는 것이 매우 번거롭고 비효율적이었습니다. 결과적으로 다양한 아키텍처 장점에도 불구하고 개발 효율성이 크게 떨어졌습니다.

Java로 구조화된 데이터 처리 및 계산 클래스 라이브러리의 전체 세트를 제공하면 개발 효율성을 저하시키지 않고 아키텍처의 장점을 누릴 수 있어 이 문제가 해결될 수 있습니다.

어떤 능력이 필요한가요?

Java에서 이상적인 구조화된 데이터 처리 라이브러리는 어떤 특성을 가져야 합니까? SQL에서 요약할 수 있습니다.

1 집합 컴퓨팅 기능

구조화된 데이터는 종종 배치(세트 형태)로 나타나는 경우가 많습니다. 이러한 유형의 데이터를 편리하게 계산하려면 충분한 집합 컴퓨팅 기능을 제공해야 합니다.

집합 연산 라이브러리가 없으면 기본 데이터 유형인 배열(집합과 동일)만 있습니다. 집합 구성원을 단순히 합산하려면 4~5줄의 루프 문을 작성하여 완료해야 합니다. 필터링, 그룹화, 집계 등의 작업을 작성하려면 수백 줄의 코드가 필요합니다.

SQL은 SUM/COUNT 및 기타 집계 연산과 같은 풍부한 연산 집합을 제공하고, WHERE는 필터링에 사용되고, GROUP은 그룹화에 사용되며, 집합에 대한 교집합, 합집합, 차이와 같은 기본 연산도 지원합니다. 이렇게 작성된 코드는 훨씬 짧아집니다.

2 람다 구문

설정된 연산 능력만 있으면 충분할까요? Java용 집합 연산 라이브러리를 일괄적으로 개발하면 SQL의 효과를 얻을 수 있습니까?

그렇게 간단하지 않아요!

필터링 작업을 예로 들어 보겠습니다. 필터링에는 일반적으로 조건을 충족하는 집합 멤버를 유지하는 조건이 필요합니다. SQL에서 이 조건은 표현식의 형태로 나타납니다. 예를 들어 WHERE x>0을 쓰는 것은 x>0의 계산 결과를 true로 만드는 멤버를 유지한다는 의미입니다. x>0 표현식은 이 명령문을 실행하기 전에 평가되지 않지만 반복 중에 각 집합 멤버에 대해 평가됩니다. 본질적으로 이 표현식은 기본적으로 현재 컬렉션 멤버를 매개변수로 사용하는 함수입니다. WHERE 연산의 경우 WHERE의 매개변수로 표현식으로 정의된 함수를 사용하는 것과 같습니다.

이러한 작성 방식을 람다 구문 또는 기능적 언어라고 하는 용어가 있습니다.

Lambda 구문이 없으면 임시로 함수를 정의해야 하는 경우가 많아 코드가 매우 번거롭고 이름 충돌이 발생하기 쉽습니다.

Lambda 구문은 SQL에서 널리 사용됩니다. 필터링 및 그룹화 작업에는 필요하지 않으며 계산된 열과 같은 불필요한 시나리오에도 사용할 수 있어 코드가 크게 단순화됩니다.

3 Lambda 구문에서 필드를 직접 참조

구조화된 데이터는 단순한 단일 값이 아니라 필드가 있는 레코드입니다.

SQL 표현식 매개변수에서 레코드 필드를 참조할 때 대부분의 경우 필드가 속한 레코드를 지정하지 않고 필드 이름을 직접 사용할 수 있다는 사실을 발견했습니다. 이름이 같은 필드가 여러 개 있는 경우에만 테이블 이름(또는 별칭).

Java의 새 버전도 Lambda 구문을 지원하기 시작했지만 현재 레코드를 Lambda 구문으로 정의된 함수에 매개변수로 전달한 다음 계산 공식을 작성할 때 항상 이 레코드를 가져올 수 있습니다. 예를 들어 단가와 수량을 이용하여 금액을 계산할 때, 현재 구성원을 나타내는 데 사용되는 매개변수의 이름이 x라면 "x.단가 * x.수량"이라는 장황한 형식으로 작성해야 합니다. SQL에서는 "단가*수량"으로 보다 직관적으로 작성할 수 있습니다.

4 동적 데이터 구조

SQL도 동적 데이터 구조를 매우 잘 지원할 수 있습니다.

구조화된 데이터 계산에서 반환 값은 구조화된 데이터인 경우가 많으며, 결과 데이터 구조는 작업과 관련되어 있으며 코드를 작성하기 전에는 준비할 수 없습니다. 따라서 동적 데이터 구조 기능을 지원하는 것이 필요합니다.

SQL의 모든 SELECT 문은 새로운 데이터 구조를 생성하며, 구조(클래스)를 미리 정의하지 않고도 코드에서 필드를 추가하고 삭제할 수 있습니다. 이는 Java와 같은 언어에서는 불가능합니다. 사용되는 모든 구조(클래스)는 코드 컴파일 단계에서 정의되어야 하며, 원칙적으로 실행 중에 새로운 구조를 생성할 수 없습니다.

5 해석된 언어

이전 기사의 분석을 통해 우리는 이미 Java 자체가 구조화된 데이터 처리를 위한 언어로 적합하지 않다는 결론을 내릴 수 있었습니다. Lambda 메커니즘은 기능 3을 지원하지 않으며 컴파일된 언어로서 기능 4를 구현할 수 없습니다.

사실 앞서 언급한 람다 구문은 컴파일된 언어로 구현하기에는 적합하지 않습니다. 매개변수 위치에 쓴 표현식이 그 자리에서 표현식의 값을 계산해서 전달해야 하는지, 아니면 전체 표현식을 함수로 컴파일해서 전달해야 하는지, 더 많은 구문 기호가 필요한지 컴파일러는 판단할 수 없습니다. 구별할 수 있도록 디자인되었습니다. 해석된 언어에는 이러한 문제가 없습니다. 매개변수로서의 표현식이 먼저 계산되는지 아니면 집합 멤버를 순회한 후 계산되는지는 함수 자체에서 결정할 수 있습니다.

SQL은 실제로 해석된 언어입니다.

SPL 소개

Stream은 Java 8에서 공식적으로 출시된 구조화된 데이터 처리 라이브러리이지만 위의 요구 사항을 충족하지 않습니다. 전문적인 구조화된 데이터 유형이 없고 중요한 구조화된 데이터 계산 기능이 많이 부족하며 해석된 언어가 아니며 동적 데이터 유형을 지원하지 않으며 Lambda 구문의 인터페이스가 복잡합니다.

Kotlin은 Java 생태계의 일부로 Stream을 기반으로 약간의 개선이 이루어졌으며 구조화된 데이터 계산 유형도 제공합니다. 그러나 구조화된 데이터 계산 기능이 부족하여 해석된 언어가 아니며 동적 데이터를 지원하지 않습니다. .Type, Lambda 구문의 인터페이스는 복잡하며 여전히 이상적인 구조화된 데이터 컴퓨팅 클래스 라이브러리가 아닙니다.

Scala는 풍부한 구조적 데이터 계산 기능을 제공하지만, 컴파일된 언어의 특성상 이상적인 구조적 데이터 계산 클래스 라이브러리가 되기에는 어렵습니다.

그렇다면 Java 생태계에서는 또 무엇을 사용할 수 있을까요?

esProc SPL.

SPL은 Java로 해석되고 실행되는 프로그래밍 언어로, 풍부한 구조화된 데이터 계산 클래스 라이브러리, 간단한 Lambda 구문 및 편리하고 사용하기 쉬운 동적 데이터 구조를 갖추고 있으며 Java에서 이상적인 구조화된 처리 클래스 라이브러리입니다.

풍부한 집합 연산 기능

SPL은 전문적인 구조화된 데이터 유형, 즉 시퀀스 테이블을 제공합니다. 시퀀스 테이블은 SQL 데이터 테이블과 마찬가지로 배치 레코드의 집합이며 구조화된 데이터 유형의 일반적인 기능을 가지고 있습니다.

소스 데이터를 구문 분석하고 시퀀스 테이블 생성:

Orders=T("d:/Orders.csv")
로그인 후 복사

원본 시퀀스 테이블에서 열 이름으로 새 시퀀스 테이블 생성:

Orders.new(OrderID, Amount, OrderDate)
로그인 후 복사

계산된 열:

Orders.new(OrderID, Amount, year(OrderDate))
로그인 후 복사

필드 이름 변경:

Orders.new(OrderID:ID, SellerId, year(OrderDate):y)
로그인 후 복사

필드를 시퀀스 번호로 사용:

Orders.groups(year(_5),_2; sum(_4))
로그인 후 복사

Sequence Table rename (왼쪽 연관)

join@1(Orders:o,SellerId ; Employees:e,EId).groups(e.Dept; sum(o.Amount))
로그인 후 복사

Sequence 테이블은 모든 구조화된 계산 함수를 지원하며, 계산 결과도 Map과 같은 데이터 유형이 아닌 Sequence 테이블입니다. 예를 들어, 그룹화된 요약 결과를 위해 구조화된 데이터를 계속 처리합니다.

Orders.groups(year(OrderDate):y; sum(Amount):m).new(y:OrderYear, m*0.2:discount)
로그인 후 복사

시퀀스 테이블을 기반으로 SPL은 필터링, 정렬, 그룹화, 중복 제거, 이름 변경, 계산된 열, 연관, 하위 쿼리와 같은 풍부한 구조화된 데이터 계산 기능을 제공합니다. , 계산 설정, 순서 계산 등 이러한 함수는 강력한 컴퓨팅 성능을 가지며 하드 코딩 지원 없이 독립적으로 계산을 완료할 수 있습니다.

결합 쿼리:

Orders.select(Amount>1000 && Amount<=3000 && like(Client,"*bro*"))
로그인 후 복사

정렬:

Orders.sort(-Client,Amount)
로그인 후 복사

그룹 요약:

Orders.groups(year(OrderDate),Client; sum(Amount))
로그인 후 복사

내부 연관:

join(Orders:o,SellerId ; Employees:e,EId).groups(e.Dept; sum(o.Amount))
로그인 후 복사

간결한 Lambda 구문

SPL 간단한 Lambda 구문을 지원합니다. 함수 이름과 함수 본문을 정의할 필요가 없습니다. 표현식을 필터링과 같은 함수 매개변수로 직접 사용할 수 있습니다.

Orders.select(Amount>1000)
로그인 후 복사

비즈니스 로직을 수정할 때 함수를 재구성할 필요가 없으며 간단히 수정하면 됩니다. 표현식 :

Orders.select(Amount>1000 && Amount<2000)
로그인 후 복사

SPL은 해석된 언어입니다. 매개변수 표현식을 사용할 때 매개변수 유형을 명시적으로 정의할 필요가 없으므로 Lambda 인터페이스가 더 간단해집니다. 예를 들어, 제곱합을 계산하려는 경우 다음과 같이 직관적으로 작성할 수 있습니다.

Orders.sum(Amount*Amount)
로그인 후 복사

SQL과 유사하게 SPL 구문은 단일 테이블 계산에서 필드 이름을 직접 사용할 수도 있습니다.

Orders.sort(-Client, Amount)
로그인 후 복사

동적 데이터 구조

SPL 동적 데이터 구조를 자연스럽게 지원하고, 계산 결과 구조를 기반으로 새로운 시퀀스 테이블을 동적으로 생성할 수 있는 해석 언어입니다. 계산된 열, 그룹 요약 및 상관 관계와 같은 계산에 특히 적합합니다. 예를 들어 그룹 요약 결과를 직접 다시 계산하는 경우:

Orders.groups(Client;sum(Amount):amt).select(amt>1000 && like(Client,"*S*"))
로그인 후 복사

또는 상관 관계 계산 결과를 직접 다시 계산하는 경우:

join(Orders:o,SellerId ; Employees:e,Eid).groups(e.Dept; sum(o.Amount))
로그인 후 복사

일반적으로 더 복잡한 계산이 필요합니다. 여러 단계로 분할되면 각 중간 결과의 데이터 구조가 거의 다릅니다. SPL은 이러한 중간 결과의 구조를 먼저 정의하지 않고도 동적 데이터 구조를 지원합니다. 예를 들어, 특정 연도의 고객 결제 기록표를 기준으로 월별 결제 금액 상위 10명의 고객을 계산합니다.

Sales2021.group(month(sellDate)).(~.groups(Client;sum(Amount):sumValue)).(~.sort(-sumValue)) .(~.select(#<=10)).(~.(Client)).isect()
로그인 후 복사

SQL 직접 실행

SPL은 SQL 직접 실행이 가능한 SQL 인터프리터도 구현합니다. SQL 지원 기본 WHERE 및 GROUP부터 JOIN 및 WITH까지 모든 기능:

$select * from d:/Orders.csv where (OrderDate<date(&#39;2020-01-01&#39;) and Amount<=100)or (OrderDate>=date('2020-12-31') and Amount>100)
로그인 후 복사
$select year(OrderDate),Client ,sum(Amount),count(1) from d:/Orders.csv
group by year(OrderDate),Client
having sum(Amount)<=100
로그인 후 복사
$select o.OrderId,o.Client,e.Name e.Dept from d:/Orders.csv o
join d:/Employees.csv e on o.SellerId=e.Eid
로그인 후 복사
$with t as (select Client ,sum(amount) s from d:/Orders.csv group by Client)
select t.Client, t.s, ct.Name, ct.address from t
left join ClientTable ct on t.Client=ct.Client
로그인 후 복사

더 많은 언어 장점

전문적인 구조적 데이터 처리 언어인 SPL은 SQL의 모든 컴퓨팅 기능을 포괄할 뿐만 아니라 더 강력한 장점도 있습니다.

이산성 및 더욱 철저한 집계 지원

Collection은 SQL의 기본 기능으로 데이터가 집합 형태로 작업에 참여할 수 있도록 지원합니다. 그러나 SQL의 개별적 특성은 매우 열악합니다. 모든 집합 멤버는 전체적으로 작업에 참여해야 하며 집합에서 분리될 수 없습니다. Java와 같은 고급 언어는 좋은 이산성을 지원하며 배열 멤버는 독립적으로 작동할 수 있습니다.

但是,更彻底的集合化需要离散性来支持,集合成员可以游离在集合之外,并与其它数据随意构成新的集合参与运算 。

SPL兼具了SQL的集合化和Java的离散性,从而可以实现更彻底的集合化。

比如,SPL中很容易表达“集合的集合”,适合分组后计算。比如,找到各科成绩均在前10名的学生:


A
1=T(“score.csv”).group(subject)
2=A2.(.rank(score).pselect@a(<=10))
3=A1.(~(A3(#)).(name)).isect()
SPL序表的字段可以存储记录或记录集合,这样可以用对象引用的方式,直观地表达关联关系,即使关系再多,也能直观地表达。比如,根据员工表找到女经理下属的男员工:
Employees.select(性别:"男",部门.经理.性别:"女")
로그인 후 복사

有序计算是离散性和集合化的典型结合产物,成员的次序在集合中才有意义,这要求集合化,有序计算时又要将每个成员与相邻成员区分开,会强调离散性。SPL兼具集合化和离散性,天然支持有序计算。

具体来说,SPL可以按绝对位置引用成员,比如,取第3条订单可以写成Orders(3),取第1、3、5条记录可以写成Orders([1,3,5])。

SPL也可以按相对位置引用成员,比如,计算每条记录相对于上一条记录的金额增长率:Orders.derive(amount/amount[-1]-1)

SPL还可以用#代表当前记录的序号,比如把员工按序号分成两组,奇数序号一组,偶数序号一组:Employees.group(#%2==1)

更方便的函数语法

大量功能强大的结构化数据计算函数,这本来是一件好事,但这会让相似功能的函数不容易区分。无形中提高了学习难度。

SPL提供了特有的函数选项语法,功能相似的函数可以共用一个函数名,只用函数选项区分差别。比如select函数的基本功能是过滤,如果只过滤出符合条件的第1条记录,只须使用选项@1:

Orders.select@1(Amount>1000)
로그인 후 복사

数据量较大时,用并行计算提高性能,只须改为选项@m:

Orders.select@m(Amount>1000)
로그인 후 복사

对排序过的数据,用二分法进行快速过滤,可用@b:

Orders.select@b(Amount>1000)
로그인 후 복사

函数选项还可以组合搭配,比如:

Orders.select@1b(Amount>1000)
로그인 후 복사

结构化运算函数的参数常常很复杂,比如SQL就需要用各种关键字把一条语句的参数分隔成多个组,但这会动用很多关键字,也使语句结构不统一。

SPL支持层次参数,通过分号、逗号、冒号自高而低将参数分为三层,用通用的方式简化复杂参数的表达:

join(Orders:o,SellerId ; Employees:e,EId)
로그인 후 복사

扩展的Lambda语法

普通的Lambda语法不仅要指明表达式(即函数形式的参数),还必须完整地定义表达式本身的参数,否则在数学形式上不够严密,这就让Lambda语法很繁琐。比如用循环函数select过滤集合A,只保留值为偶数的成员,一般形式是:

A.select(f(x):{x%2==0} )
로그인 후 복사

这里的表达式是x%2==0,表达式的参数是f(x)里的x,x代表集合A里的成员,即循环变量。

SPL用固定符号~代表循环变量,当参数是循环变量时就无须再定义参数了。在SPL中,上面的Lambda语法可以简写作:A.select(~ %2==0)

普通Lambda语法必须定义表达式用到的每一个参数,除了循环变量外,常用的参数还有循环计数,如果把循环计数也定义到Lambda中,代码就更繁琐了。

SPL用固定符号#代表循环计数变量。比如,用函数select过滤集合A,只保留序号是偶数的成员,SPL可以写作:A.select(# %2==0)

相对位置经常出现在难度较大的计算中,而且相对位置本身就很难计算,当要使用相对位置时,参数的写法将非常繁琐。

SPL用固定形式[序号]代表相对位置


A B
1 =T(“Orders.txt”) /订单序表
2 =A1.groups(year(Date):y,month(Date):m; sum(Amount):amt) /按年月分组汇总
3 =A2.derive(amt/amt[-1]:lrr, amt[-1:1].avg():ma) /计算比上期和移动平均

无缝集成、低耦合、热切换

作为用Java解释的脚本语言,SPL提供了JDBC驱动,可以无缝集成进Java应用程中。

简单语句可以像SQL一样直接执行:

…
Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
PrepareStatement st = conn.prepareStatement("=T(\"D:/Orders.txt\").select(Amount>1000 && Amount<=3000 && like(Client,\"*S*\"))");
ResultSet result=st.execute();
...
로그인 후 복사

复杂计算可以存成脚本文件,以存储过程方式调用

…
Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
Statement st = connection.();
CallableStatement st = conn.prepareCall("{call splscript1(?, ?)}");
st.setObject(1, 3000);
st.setObject(2, 5000); 
ResultSet result=st.execute();
...
로그인 후 복사

将脚本外置于Java程序,一方面可以降低代码耦合性,另一方面利用解释执行的特点还可以支持热切换,业务逻辑变动时只要修改脚本即可立即生效,不像使用Java时常常要重启整个应用。这种机制特别适合编写微服务架构中的业务处理逻辑。

推荐学习:《java视频教程

위 내용은 Java 구조화된 데이터 처리 오픈 소스 라이브러리 SPL을 이해해 보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!