티스토리 뷰
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 로 없는게 좀 아쉽다)
'데이터처리 > Hive' 카테고리의 다른 글
[Hive 4.x] 새버전에 추가된 유용한 UDF 소개 1탄 - approx_distinct (0) | 2024.06.24 |
---|---|
[MACRO] HIVE 에서 UDF 를 쓰지 않고, 수식을 간단하게 하는 방법 (1) | 2024.06.07 |
[HIVE] Struct 타입의 일부값만 변경하는 UDF : set_value (2) | 2024.02.07 |
[HIVE] hive 4.x 에 있는 array udf 추출버전 jar - hive 3.x 버전에서 활용하기 (0) | 2024.01.29 |
[HIVE] hive 4.x 버전에 추가된 array 함수 8개 : 예제 포함 (0) | 2024.01.26 |