하이브에서 문자열을 구문 분석하는 방법 (문자열 연결 및 구문 분석)

시나리오 : (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로

추천

출처blog.csdn.net/limiaoiao/article/details/99674613