Json list 데이터를 JOIN시

126 views
Skip to first unread message

wonhee lee

unread,
May 10, 2016, 7:43:06 AM5/10/16
to Apache Tajo 한국 사용자 그룹
안녕하세요. 이원희 입니다.

수집되는 데이터가 Json list로 오는데.
각 list 안에 있는 원소들을 가지고 Join을 해야하는데..


예를 들어.. 

아래와 같은 Json 리스트 데이터를 external table로 만들고.
{
"name_list" : [
{
"name" : "name1"
},
{
"name" : "name2"
},
{
"name" : "name3"
}
]
}

create external table name_list (이하생략);


기존에 아래와 같은 테이블이 있을때,
select * from valid_name;

name, valid_yn
-----------------------
"name1", "Y"
"name2", "N"
"name3", "Y"



name_list에 있는 name과 valid_name에 있는 name을 JOIN 하고 싶은 건데요.

이런경우 JOIN이 가능한가요?

http://tajo.apache.org/docs/current/functions/json_func.html 페이지에 Json function이 있긴한데..
이걸 이용해서 어떻게 쿼리를 짜야할지 잘 모르겠네요.


혹은 타조 이용해서 데이터 분석시.. 애초에 저런 Json list로 데이터를 쌓지 못하게 해야 할까요.. ㅠㅠ

Jihoon Son

unread,
May 11, 2016, 9:03:58 AM5/11/16
to wonhee lee, Apache Tajo 한국 사용자 그룹
안녕하세요, 현재는 json 함수들을 사용하면 가능은 할 수 있습니다만, 사용하기엔 조금 까다로울 것 같습니다. 굳이 사용하려면 다음과 같이 해야할 것 같습니다.

예를 들어 name_list를 다음 처럼 external table로 만들 수 있습니다.

> create external table name_table (*) using json location '/path/to/name_list';

name_list에서 첫 번째 name 값을 뽑으려면 다음과 같이 실행하면 됩니다.

> select json_extract_path_text( json_array_get(name_list, 0), '$.name') from name_table;
?json_extract_path_text 
------------------------------- 
name1 
(1 rows, 0.059 sec, 0 B selected)

하지만 이 방법으로 모든 name 값을 꺼내려면 상당히 복잡할 것 같네요. 따라서 두 가지 대안이 있을 것 같습니다.

첫 번째는 말씀하신대로 로그 포멧을 바꾸는 방법이 있을 것 같습니다. 이 방법은 로그 포멧을 바꾸는데 드는 비용을 고려해야할 것 같습니다.
다른 하나는 타조 0.12 버전을 기다리는 것 입니다. 타조 0.12 버전부터는 nested json 파일을 바로 읽어서 처리할 수 있기 때문에 위처럼 따로 함수를 사용하지 않아도 쉽게 사용하실 수 있습니다.

손지훈 드림

2016년 5월 10일 (화) 오후 8:43, wonhee lee <gugufu...@gmail.com>님이 작성:

wonhee lee

unread,
May 11, 2016, 11:37:05 PM5/11/16
to Apache Tajo 한국 사용자 그룹, gugufu...@gmail.com
아.. 그렇군요.

일단은 저 함수사용해서 데이터 포멧을 한번 바꾸는 작업후에 
데이터를 뽑는 방향으로 진행해야겠네요.

혹시 0.12버전에 어떤 문법으로 읽을수 있게 되는지 알 수 있을까요? 
배포일도 궁금합니다. ^^

감사합니다.

Jihoon Son

unread,
May 12, 2016, 7:37:58 AM5/12/16
to wonhee lee, Apache Tajo 한국 사용자 그룹
아직 결정된 것은 아니나, 아마도 Hive와 유사한 방법으로 지원할 것으로 예상됩니다. Hive 문법은 https://cwiki.apache.org/confluence/display/Hive/Tutorial 의 Complex types 항목을 참고하시면 됩니다.

배포일도 아직 결정되지 않았습니다. 초기 구현이 완료된 후에는 테스트 기간이 필요하기 때문에, 제 생각에 적어도 1달 정도는 걸릴 것으로 생각합니다.

손지훈 드림

2016년 5월 12일 (목) 오후 12:37, wonhee lee <gugufu...@gmail.com>님이 작성:

wonhee lee

unread,
May 13, 2016, 4:10:00 AM5/13/16
to Apache Tajo 한국 사용자 그룹, gugufu...@gmail.com
안녕하세요.

select name_list[0] from name_list;

이런식으로 조회할수 있다는 건 이해했습니다. ^^

근데, name_list에 몇개의 리스트가 있는지 알수 없고.. 
저 리스트를 쭉 나열해서 valid_name 테이블하고 조인을 하고 싶은건데요.

무식한 방법으로 이런 식이 되겠네요..

select a.name, b.vaild_yn 
from
select name from 
(
 select name_list[0] from name_list
 union all
 select name_list[1] from name_list
 union all
 select name_list[2] from name_list
)a,
valid_name b
where a.name = b.name;

음.. 일단 우아한 방법도 아닌 것 같고.
이 경우에는 name_list size가 3인걸 알고 있으니까 저렇게라도 짤수 있는 건데..

list 사이즈가 동적으로 오는 경우, 어떤 식으로 하는게 좋을 지 모르겠네요. ㅠㅠ







Jihoon Son

unread,
May 13, 2016, 4:16:00 AM5/13/16
to wonhee lee, Apache Tajo 한국 사용자 그룹
안녕하세요, 제가 전에 설명을 빠트렸네요.
네, 말씀하신 것 처럼 단순히 쉽게 access 할 수 있는 문법으로는 join 하기가 까다롭습니다. 이런 경우에 쉽게 할 수 있는 방법은 UDTF를 사용하는 것입니다.
예를 들어, hive의 explode(array) (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inTable-GeneratingFunctions(UDTF) 처럼 array 를 입력 받아 그 안의 element를 모두 row로 리턴하는 함수가 있으면 말씀하신 문제는 해결될 것 같습니다.

0.12.0에 complex type들 지원과 함께 이러한 UDTF들도 지원될 예정입니다.

손지훈 드림

2016년 5월 13일 (금) 오후 5:10, wonhee lee <gugufu...@gmail.com>님이 작성:

wonhee lee

unread,
May 18, 2016, 7:05:36 AM5/18/16
to Apache Tajo 한국 사용자 그룹, gugufu...@gmail.com
안녕하세요.

분석해야 하는 로그에 
Json array가 아닌 일반 String에 콤마(,)를 구분자로 해서 쌓이는 로그가 있는데,
혹시 0.12.0에 반영되는  explode(array) 함수를 위의 경우에도 사용이 가능 한가요??

Jihoon Son

unread,
May 19, 2016, 1:29:13 AM5/19/16
to Apache Tajo 한국 사용자 그룹, gugufu...@gmail.com
안녕하세요,

말씀하신 경우는 바로 하기는 힘들 것 같고 따로 함수를 하나 만들어야 할 것 같습니다.
많은 경우에 사용될 수도 있을 것 같아 Builtin 으로 넣는 것도 고민해보겠습니다.

손지훈 드림

2016년 5월 18일 수요일 오후 8시 5분 36초 UTC+9, wonhee lee 님의 말:

wonhee lee

unread,
May 19, 2016, 3:21:10 AM5/19/16
to Apache Tajo 한국 사용자 그룹, gugufu...@gmail.com
네. 꼭 부탁드립니다. 
Reply all
Reply to author
Forward
0 new messages