복붙노트

[HADOOP] 곧 unnest JSON

HADOOP

곧 unnest JSON

이 질문에 다음과 교차하는 방법 프레스토에서 JSON 배열 unnest 가입

내가 제공하는 예제를 실행하려하지만, 그렇게하는 동안 얻을 오류

SQL 명령 :

select x.n
from
unnest(cast(json_extract('{"payload":[{"type":"b","value":"9"}, 
{"type":"a","value":"8"}]}','$.payload') as array<varchar>)) as  x(n)

내가 가진 오류 :

값이 배열에 캐스트 할 수없는 java.lang.RuntimeException가 : java.lang.NullPointerException이 : 문자열은 null입니다

해결법

  1. ==============================

    1.SELECT JSON_EXTRACT ( "{"페이로드 ": [{"입력 ","B ","값 ":"9 "}, {"타입 ":"A ","값 ":"8 "}]} ',' $의 .payload ')

    SELECT JSON_EXTRACT ( "{"페이로드 ": [{"입력 ","B ","값 ":"9 "}, {"타입 ":"A ","값 ":"8 "}]} ',' $의 .payload ')

    제공 :

    [{ "입력", "B", "값": "9"}, { "타입": "A", "값": "8"}]

    ARRAY 인 >. 당신은 당신의 쿼리를 변경할 수 있습니다 :   SELECT x.n   에서   UNNEST (CAST (JSON_EXTRACT ( "{"페이로드 ": [{"입력 ","B ","값 ":"9 "}, {"타입 ":"A ","값 ":"8 "}]} ","$. 페이로드 ') ARRAY AS >)) (N)

  2. ==============================

    2.반환 데이터 형의 한 가지 가능한 해석은 다음과 같다 :

    반환 데이터 형의 한 가지 가능한 해석은 다음과 같다 :

    ARRAY<MAP<VARCHAR,VARCHAR>>
    

    하지만지도에 값을 액세스하는 점 표기법을 사용하여 수행 할 수없는 단점이있다.

    가정에 대한 대안 데이터 형식이 될 것입니다 :

    ARRAY (ROW (VARCHAR 유형, 값 VARCHAR))

    어느 ARRAY

    대규모 여담은 여기 >> JSON은 약간 모호합니다.

    어느 쪽이 맞습니까? JSON은 (당신의 언어를 호출 어떤 이름 속성의 가방을 객체 클래스) (당신의 언어를 호출 어떤 해시 맵, 사전, 키 - 값 쌍) 또는 더 구조체처럼지도의 표현을 반대인가? 그것은 자바 스크립트 (개체 표기법) 배열, 객체, 기본 유형에 대한 수용하도록에서 유래하지만, 더 광범위한 사용은 다른 언어 모호한 매핑 (HA)을 의미합니다. 아마도 기능적으로 동일하지만 무작위 / 읽고 쓰고 ROW 아마 몇 가지 추가 객체 지향 오버 헤드를 가지고 있지만,이 모든 나는 아무 대답이 없다, 그래서 모든 것을 어쨌든 객체를 자바로 구현하기위한 이론적으로 MAP은 빨리해야한다. 당신이 원하는대로 사용합니다. << I 빗나가.

    당신은 자세한이 조금 발견 :

    SELECT 
    x.n['type'] as "type",
    x.n['value'] as "value"
    FROM UNNEST (
                CAST(
                    JSON_EXTRACT('{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'
                                 ,'$.payload') 
                    AS ARRAY<MAP<VARCHAR, VARCHAR>>
                    )
                ) 
            AS x(n)
    

    여기에 대안이다

    SELECT
        n.type,
        n.value
    FROM UNNEST(
                CAST(
                    JSON_EXTRACT(
                                '{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'
                                ,'$.payload'
                                ) 
                    as ARRAY(ROW(type VARCHAR, value VARCHAR))
                    )
                ) as x(n)
    

    그것은 자세한으로 단지; 컬럼의 이름은 바로 CAST 표현식으로 이동하고 있지만, 아마도 (주관적!) 쉽게 볼 수 있습니다.

  3. ==============================

    3.당신은 각각의 컬럼에 JSON_EXTRACT, CAST 마지막 UNNEST을 사용할 수 있습니다

    당신은 각각의 컬럼에 JSON_EXTRACT, CAST 마지막 UNNEST을 사용할 수 있습니다

    SELECT type,value FROM 
    UNNEST(CAST(JSON_EXTRACT('{"payload":[{"type":"b","value":"9"}, 
                              {"type":"a","value":"8"}]}'
                             ,'$.payload'
                     ) as ARRAY(ROW(type VARCHAR, value VARCHAR)
                )
           )
    ) as x(type,value)
    

    아래와 같은 출력을 제공

     type | value
    ------+-------
     b    | 9
     a    | 8
    
  4. from https://stackoverflow.com/questions/34496811/presto-unnest-json by cc-by-sa and MIT license