6.데이터 병합

Edit

6.1joinjoin

입력으로 받는 데이터의 필드와 서브 쿼리 결과 필드를 비교해 결합(join)합니다.

join은 스트림 쿼리를 지원하지 않습니다. 스트림 쿼리에 조인을 적용하려면 streamjoin 명령어를 사용하세요.

문법

join [type=cross|full|inner|left|leftonly|right|rightonly] KEY_FIELD_1[, KEY_FIELD_2, ...] [ SUBQUERY ]
type=cross|full|inner|left|leftonly|right|rightonly

조인 유형을 지정합니다. full, inner, left, leftonly, right, rightonly 중 하나를 지정합니다. 기본값은 inner입니다. 이 옵션을 지정하지 않으면 기본값을 적용합니다.

KEY_FIELD_1[, KEY_FIELD_2, ...]

조인의 기준이 키 필드를 열거합니다. 구분자로 쉼표(,)를 사용합니다.

[ SUBQUERY ]

입력 데이터와 조인할 데이터를 출력하는 서브쿼리를 대괄호 쌍([ ])으로 감싸서 입력합니다.

join type 중 cross, rightonly type은 ENT-3.0.2003.0 버전부터 사용 가능합니다.

설명

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

inner join

일반적으로 조인(join)이라 하면 "inner join"을 의미합니다. 키가 일치하는 레코드만 결합해서 출력합니다. 키를 포함하지 않는 레코드는 출력하지 않습니다. 데이터의 교집합과 유사합니다.

full join

키가 일치하는 레코드는 병합해서, 키가 일치하지 않는 레코드는 있는 그대로 출력합니다. 데이터의 합집합과 유사합니다.

left join

키가 일치하는 레코드는 결합해서 출력하고, 키가 일치하지 않는 레코드는 입력 데이터의 레코드만 출력합니다.

right join

키가 일치하는 레코드는 결합해서 출력하고, 키가 일치하지 않는 레코드는 서브쿼리 결과만 출력합니다.

leftonly join

입력 레코드 집합 중에서 서브쿼리 결과 집합과 키가 일치하지 않는 레코드만 출력합니다. 키가 일치하는 레코드는 출력하지 않습니다.

rightonly join

서브쿼리 결과 집합 중에서 입력 레코드 집합과 키가 일치하지 않는 레코드만 출력합니다. 키가 일치하는 레코드는 출력하지 않습니다.

cross join

'catersian product'라고도 합니다. 입력 데이터의 집합(M개 레코드)과 서브쿼리 결과 집합(N개)을 결합해 M x N 개의 레코드로 구성된 집합을 출력합니다.

사용 예

1) code 필드를 키로 하여 inner 조인

# code 필드를 갖는 json을 입력 데이터로 전달 
| json "[{'code':1}, {'code':2}, {'code':3}]" 
| # code, name 필드를 갖는 json을 반환하는 서브쿼리문 
| # 입력 데이터와 서브쿼리문의 결과 데이터를 code 필드를 키로 하여 inner join 
| join code [
  json "[
    {'code':1, 'name':'foo'},
    {'code':2, 'name':'bar'}
  ]"
]
표 6-1쿼리 실행 결과(inner join)

code

name

1

foo

2

bar

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

json "[
  {'field1': 'A'}, {'field1': 'B'}, {'field1': 'C'}, {'field1': 'D'}]"
| join type=leftonly field1 [ 
  json "[
    {'field1': 'A', 'field2': 'Foo'}, {'field1': 'D', 'field2': 'Bar'}
  ]"
]
표 6-2쿼리 실행 결과(leftonly join)

field1

B

C

위에서 실행한 쿼리문은 다음 쿼리문과 실행 결과가 동일합니다(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)

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

json "[{'id': 1, '건수': 1000}, {'id':2, '건수': 2000}]"
| join type=right id [
  json "[
    {'id':1, '부서':'영업'}, {'id':2, '부서':'운영'}, {'id':3, '부서':'기술'}
  ]"
]
표 6-3쿼리 실행 결과(right join)

id

부서

건수

1

영업

1000

2

운영

2000

3

기술


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

json "[
  {'계정':'bob', '문서보안위반': 1}, {'계정':'alice', '문서보안위반': 5} ]"
| join type=full 계정 [
  json "[
    {'계정':'alice', '매체제어위반': 8}, {'계정':'clark', '매체제어위반': 3}
  ]"
]
표 6-4쿼리 실행 결과(full join)

계정

문서보안위반

매체제어위반

alice

5

8

clark


3

bob

1


6.2streamjoinstreamjoin

입력으로 받는 스트림 데이터의 필드와 서브 쿼리 결과 필드를 비교해 조인(join)합니다.

문법

streamjoin [type={inner|left|leftonly}] [timeout=NUM{s}] KEY_FIELD_1[, KEY_FIELD_2, ...] [ SUBQUERY ]
type={inner|left|leftonly}

조인 유형을 inner, left, leftonly 중에서 선택해 지정합니다. 이 옵션을 지정하지 않으면 기본값(inner)을 적용합니다.

timeout=NUM{s}

서브쿼리가 완료될 때까지 대기할 시간을 지정합니다. 지정하지 않으면 타임아웃 없이 무한정 대기합니다.

KEY_FIELD_1[, KEY_FIELD_2, ...]

조인의 기준이 되는 키 필드를 열거합니다. 구분자로 쉼표(,)를 사용합니다.

[ SUBQUERY ]

입력 데이터와 조인할 데이터를 출력하는 서브쿼리를 대괄호 쌍([ ])으로 감싸서 입력합니다.

streamjoin type 중 leftonly type은 ENT-3.0.2003.0 버전부터 사용 가능합니다.

설명

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

로그프레소를 실행할 때 아래 옵션을 지정하여 메모리 풀 크기를 조절할 수 있습니다. 기본값은 '500M'입니다. 다음 예시와 같이 메모리 풀 크기를 지정할 수 있습니다:
-Dlogpresso.streamjoin.max_buffer_size=1G

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

사용 예

1) 데이터베이스에서 가져온 데이터와 code 필드를 키로 하여 조인

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

2) 데이터베이스에서 가져온 데이터와 code 필드를 키로 하여 조인. 단, SQL 쿼리를 10초로 제한

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

6.3unionunion

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

문법

union [ SUBQUERY ]
[ SUBQUERY ]

입력 데이터와 조인할 데이터를 출력하는 서브쿼리를 대괄호 쌍([ ])으로 감싸서 입력합니다.

사용 예

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

dbquery db1 select * from nodelist
| union [ dbquery db2 select * from nodelist ]
Count of comments [0]