9.데이터 병합

Edit

9.1join

문법

join [type=조인유형] 조인컬럼1, 조인컬럼2, … [ 서브쿼리 ]

서브 쿼리 결과 집합을 조인합니다. 스트림 쿼리에서는 join 명령어가 지원되지 않으므로, 이후에 설명할 streamjoin 명령어를 사용해야 합니다.

type

조인 유형을 지정합니다. inner, left, right, full 중 하나를 지정합니다. 기본값은 inner 입니다.

조인 유형에 따른 쿼리 결과는 아래와 같습니다.

inner

입력되는 데이터의 키가 서브쿼리 결과집합에 존재하는 경우에만 필드를 추가하여 출력합니다.

left

입력되는 데이터의 키가 서브쿼리 결과집합에 존재하는 경우에는 서브쿼리 필드를 추가하여 출력하고, 존재하지 않는 경우에는 입력 데이터를 그대로 출력합니다.

leftonly

입력되는 데이터의 키가 서브쿼리 결과집합에 존재하지 않는 경우에만 입력 데이터를 그대로 출력합니다.

right

left 유형과 반대로, 서브쿼리 결과집합의 키가 입력되는 데이터에 존재하는 경우에는 서브쿼리 필드를 추가하여 출력하고, 존재하지 않는 경우에는 서브쿼리 데이터를 그대로 출력합니다.

full

입력 데이터와 서브쿼리 결과집합의 데이터 키가 일치하는 경우에는 서브쿼리 필드를 추가하여 출력하고, 존재하지 않는 경우에는 입력 데이터와 서브쿼리 데이터를 각각 그대로 출력합니다.

사용 예

1) 메타데이터를 조인하여 필드 확장 (inner join)

json "[ {'code':1}, {'code':2}, {'code':3} ]" 
| join code [ json " [ {'code':1, 'name':'foo'}, {'code':2, 'name':'bar'} ] " ]
표 9-1입력 데이터

code

1

2

3

표 9-2서브쿼리 결과

code

name

1

foo

2

bar

표 9-3조인 결과

code

name

1

foo

2

bar

2) 서브 쿼리에서 조회되는 결과를 제외하고 출력 (left join)

json "[ { 'field1': 'A' }, {'field1': 'B'}, {'field1': 'C'}, {'field1': 'D'} ]" 
| join type=left field1 [ 
    json "[ { 'field1': 'A', 'field2': 'Foo' }, {'field1': 'D', 'field2': 'Bar'} ]" ] 
| search isnull(field2)
표 9-4입력 데이터

field1

A

B

C

D

표 9-5서브쿼리 결과

field1

field2

A

Foo

D

Bar

표 9-6조인 결과

field1

field2

A

Foo

B


C


D

Bar

표 9-7전체 쿼리 결과 (leftonly 결과와 동일)

field1

B

C

3) 부서별 통계 출력, 통계 값이 존재하지 않더라도 모든 부서를 출력 (right join)

json "[ {'id': 1, '건수': 1000}, {'id':2, '건수': 2000} ]" 
| join type=right id [ json " [ {'id':1, '부서':'영업'}, {'id':2, '부서':'운영'}, {'id':3, '부서':'기술'} ] " ]
표 9-8입력 데이터

id

건수

1

1000

2

2000

표 9-9서브쿼리 결과

id

부서

1

영업

2

운영

3

기술

표 9-10조인 결과

id

부서

건수

1

영업

1000

2

운영

2000

3

기술


4) 문서보안과 매체제어 위반 로그를 계정 기준으로 조합하고, 미일치시 각 로그 출력 (full join)

json "[ {'계정':'xeraph', '문서보안위반': 1}, {'계정':'gotoweb', '문서보안위반': 5}]" 
| join type=full 계정 [ json " [ {'계정':'gotoweb', '매체제어위반': 8}, {'계정':'stania', '매체제어위반': 3} ] " ]
표 9-11입력 데이터

계정

문서보안위반

xeraph

1

gotoweb

5

표 9-12서브쿼리 결과

계정

매체제어위반

gotoweb

8

stania

3

표 9-13조인 결과

계정

문서보안위반

매체제어위반

gotoweb

5

8

stania


3

xeraph

1


9.2union

문법

union [ 서브쿼리 ]

서브 쿼리의 결과를 병합합니다. union은 다른 쿼리와 병행하여 실행되므로 출력 순서를 보장하지 않습니다. 통계 처리를 수행하는 경우처럼, 순서가 중요하지 않으면서 높은 수행 성능이 필요할 때에 주로 사용합니다.

사용 예

1) 2개 DB의 SQL 쿼리 결과를 병합

dbquery db1 select * from nodelist
| union [ dbquery db2 select * from nodelist ]

9.3streamjoin

문법

streamjoin [type=inner] [timeout=0s] 조인컬럼1, 조인컬럼2, … [ 서브쿼리 ]

입력 데이터와 서브 쿼리 결과 집합을 조인합니다. 서브쿼리의 결과를 오프힙 메모리에 적재하고 해시 조인을 수행하므로 join 명령어보다 속도가 빠르며, 스트림 쿼리에서도 사용할 수 있습니다. 다만, 메모리 풀 크기에 따라 조인할 수 있는 데이터 양에 제한이 있습니다. 서브쿼리가 실패하면 _streamjoin_fail 필드로 입력 데이터에 예외 메시지를 추가합니다.

type

inner 혹은 left. 미설정 시 inner 조인을 수행합니다.

timeout

서브쿼리 완료를 대기할 시간. 미설정 시 타임아웃 없이 무한정 대기합니다.

streamjoin은 한정된 크기의 메모리 풀을 사용하며, 모든 streamjoin 명령어는 하나의 메모리 풀을 나누어 사용합니다. 자바가상머신을 실행할 때 아래 옵션을 지정하여 메모리 풀 크기를 조절할 수 있습니다. 메모리 크기를 지정하지 않으면 500MB가 기본값으로 할당됩니다.

-Dlogpresso.streamjoin.max_buffer_size=500M

메모리 사용 현황을 아래의 쿼리로 조회할 수 있습니다:

메모리 풀 사용 현황

system memory pools

쿼리별 메모리 사용 현황

system memory objects

사용 예

1) 데이터베이스에 있는 메타데이터와 조인하여 필드 확장

json "[ {'code':1}, {'code':2}, {'code':3} ]" 
| streamjoin code [ dbquery ora select code, description from tbl_codes ]

2) 데이터베이스에 있는 메타데이터와 조인하여 필드 확장. 단, SQL 쿼리를 10초로 제한

json "[ {'code':1}, {'code':2}, {'code':3} ]"  
| streamjoin timeout=10s code [ 
    dbquery ora select code, description from tbl_codes ]
Count of comments [0]