티스토리 뷰

반응형

json 문자열을 complex data types 으로 바꿔줄 수 있는 유용한 함수이다.

이게 유용한게 GET_JSON_OBJECT 으로 데이터를 찾아서, 묶어낼때 정규식을 써서 해결해야하는걸 데이터 타입을 바꿔서 쉽게 해결할수 있는 경우가 존재한다.

 

brickhoust 의 from_json 함수와 같은 기능을 한다고 보면 된다. 

 

2024.01.18 - [데이터처리/Hive] - [HIVE] JSON 을 다루는 함수 설명 & 예시 - brickhouse UDF

 

json_read 가 유용할 때?

hive 3.x 에서는 json_read 함수가 없다보니, 아래와 같이 json 결과가 몇건인지 혹은 데이터를 구분자로 묶어야 할때 처리가 매우 난감하다. 왜냐면 아래와 같이 문자열 [] 가 있고, 문자열에는 "" 가 존재하기 때문이다.

 

GET_JSON_OBJECT 의 결과가 배열로 받아들일때 이걸 재가공하기가 꽤 어려운 문제가 있다.

beeline> SELECT 
  GET_JSON_OBJECT(json_string, '$.[].val') as f
FROM (
  SELECT '[ {"id": 11, "val": "ha,ho"}, {"id": 33, "val": "toto"}]' as json_string
) t

+-------------------+
|         f         |
+-------------------+
| ["ha,ho","toto"]  |
+-------------------+
1 row selected (0.076 seconds)

 

hive 3.x 에서 해결방법

정규식을 이용해서 [] " 를 발라내서 유도해야하기 때문에 매우 복잡한 쿼리가 된다.

beeline> SELECT 
  concat_ws(
    '|',
    split(
      regexp_extract(
        GET_JSON_OBJECT(json_string, '$.[].val'),
        '^\\["(.*)\\"]$',
        1
      ),
      '","'
    )
  ) as join_string
  
  ,
  size(
    split(
      regexp_extract(
        GET_JSON_OBJECT(json_string, '$.[].val'),
        '^\\["(.*)\\"]$',
        1
      ),
      '","'
    )
  ) as size

FROM (
  SELECT '[ {"id": 11, "val": "ha,ho"}, {"id": 33, "val": "toto"}]' as json_string
) t
;

+--------------+-------+
| join_string  | size  |
+--------------+-------+
| ha,ho|toto   | 2     |
+--------------+-------+
1 row selected (0.085 seconds)

 

hive 4.x 에서 해결방법

json_read 함수를 이용하면 array 타입으로 변환이 가능하므로, 바로 concat_ws 아 size 함수를 바로 사용이 가능하다.

그래서 장황했던 쿼리가 매우 단순해지는 매직이 존재한다.

beeline> SELECT 
  concat_ws(
    '|',
    json_read(GET_JSON_OBJECT(json_string, '$.[].val'), 'array<string>')
  ) as join_string
  
  ,
  size(
    json_read(GET_JSON_OBJECT(json_string, '$.[].val'), 'array<string>')
  ) as size

FROM (
  SELECT '[ {"id": 11, "val": "ha,ho"}, {"id": 33, "val": "toto"}]' as json_string
) t

+--------------+-------+
| join_string  | size  |
+--------------+-------+
| ha,ho|toto   | 2     |
+--------------+-------+
1 row selected (0.08 seconds)

 

개인적으로 아쉬운건 GET_JSON_OBJECT 가 json 을 탐색할때 유용한데, complex data types 타입에서 매칭되는걸 오류없이 찾아내는게 쉽지 않아서 struct 타입을 json 문자열로 바꿔서 GET_JSON_OBJECT 로 바꾸고 싶은데 이게 cast 로 안되고, json_read 는 있는데 json_write 같은 함수는 또 안보여서 이건 좀 아쉽다.

(실제 json 을 파싱하고, 만들어내는 핵심코드는 hive 4.x 에 이미 있는데 udf 로 없는게 좀 아쉽다)

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함