시나리오 : (1) 테이블의 필드를 json 배열로 변환하고 열을 병합 한 다음 행을 병합합니다. 테스트 테이블 작성, 1315 및 11729는 테이블의 특정 필드 값이 다른 행에 속하고 123 및 456은 다른 필드의 해당 행 번호입니다. 테스트 데이터를 준비합니다. 샘플은 [{ "c1": "1315", "c2": "123"}, { "c1": "11729", "c2": "456"}]입니다. (2) 위의 예를 표의 필드 값 1315 및 123으로 분석하십시오.
1. 테스트 데이터 준비 방법 :
1) 사용 : 연결
b에서 concat_ws ( ':', 'c1', a)를 선택하십시오.
결과는 다음과 같습니다.
c1 : 1672
c1 : 5025
c1 : 12218
……
2) 큰 따옴표 추가
b에서 concat ( ',', concat ( '\ "', 'c1', '\"'), ':', concat ( '\ "', a, '\"')) kv 선택
결과는 다음과 같습니다.
"c1": "1672"
"c1": "5025"
"c1": "12218"
3) [{
SELECT CONCAT ( '{[', CONCAT (CONCAT ( '\ "', 'c1', '\"'), ':', CONCAT ( '\ "', a, '\"')), ',' , CONCAT (CONCAT ( '\ "', 'c2', '\"'), ':', CONCAT ( '\ "', nvl (b, ''), '\"')), ']}' )에서 c
결과는 다음과 같습니다.
{[ "c1": "1672", "c2": "14227"]}
{[ "c1": "12473", "c2": ""]}
4) 행 결합 (여러 필드가있는 경우 여러 필드를 그룹화하고 그룹에있는 필드의 다른 차원에주의를 기울여 원하는 결과가 병합 될 수 있음)
SELECT
id,
CONCAT ( '[', CONCAT_WS ( ',', collect_set (kw)), ']') AS kw
FROM
(SELECT
medal_id,
CONCAT (
'{'
, CONCAT (
CONCAT (CONCAT ( '\ "', ' c1 ','\ " '),': ', CONCAT ('\" ', a,'\ " ')),
', ',
CONCAT (CONCAT ('\" ','c2 ','\ " ' ), ':', CONCAT ( '\ "', nvl (b, ''), '\"')))
, '}') AS kw
GROUP BY ID에서;
결과는 다음과 같습니다.
[{ "c1": "6233", "c2": "6260"}, { "c1": "6233", "c2": "6264"}]
요약하면 테스트 데이터 준비가 완료되었습니다.
2. json 문자열을 구문 분석합니다.
저장된 데이터 유형은 문자열이며 방법은 다음과 같습니다. 먼저 [를 제거한 다음 || 구분 기호를 프로그래밍 한 다음 한 줄을 여러 줄로 변경합니다.
1) [다음과 같이 사용 : '^ \\ [(. +) \\] $', 1), '\\} \\, \\ {'를 제거하고 구분 기호를 ||로 변경하고 다음과 같이 사용합니다. ' \\} \\ | \\ | \\ { ', 각각 정규식 함수 regexp_extract (str, regexp [, idx]) 사용
regexp_replace (regexp_extract (dddd, '^ \\ [(. +) \\] $', 1), '\\} \\, \\ {', '\\} \\ | \\ | \\ {선택 ') test_002의 kw로;
결과는 다음과 같습니다.
{ "c1": "12218", "c2": ""}
{ "c1": "13314", "c2": ""} || { "c1": "9192", "c2": ""}
2) 한 줄이 여러 줄이 됨
SELECT a.id, b.kws, c.first, c.second FROM
(SELECT id, split (regexp_replace (regexp_extract (dddd, '^ \\ [(. +) \\] $', 1), '\\) } \\, \\ { ','\\} \\ | \\ | \\ { '),'\\ | \\ | ') AS kw
FROM test_002) a
LATERAL VIEW explode (a.kw) b AS kws ----- 한 줄을 여러 줄로
변환 LATERAL VIEW json_tuple (b.kws, 'c1', 'c2') c AS c1, c2; -------- 문자열 Parse에서 c1, c2 제거 그것을 밖으로.
결과는 다음과 같습니다.
100006 { "c1": "16", "c2": "14"} 1672 14227
100006 { "c1": "473", "c2": ""} 473
2. sql이 셸 (또는 하이브 -e)에서 실행 및 실행 : 하이브 -e에서 이스케이프 문자 \\를 실행하고 \\\\로 변경하면 테스트가 불가능한 다음 이스케이프 문자 \\\를 수정합니다. \\\, 예를 들면 다음과 같습니다.
SELECT
ID,
분할 (
regexp_replace (
regexp_extract (cate_condition, '^ \\\\\\ [(. +) \\\\\\] $', 1),
'\\\\\\} \\\\\ \, \\\\\\ { ','\\\\\\} \\\\\\ | \\\\\\ | \\\\\\ { '
),
'\\\\\\ | \\\\\\ | '
) kw로