복붙노트

[HADOOP] Presto에서 JSON 배열을 교차 제거하는 방법

HADOOP

Presto에서 JSON 배열을 교차 제거하는 방법

주어진 JSON 열을 포함하는 테이블 :

{"payload":[{"type":"b","value":"9"}, {"type":"a","value":"8"}]}
{"payload":[{"type":"c","value":"7"}, {"type":"b","value":"3"}]}

Presto 쿼리를 작성하여 모든 항목에 평균 b 값을 부여하려면 어떻게해야합니까?

지금까지 나는 하이브의 측면보기가 폭발하는 것을 사용할 필요가 있다고 생각합니다. 그와 동등한 것은 Presto에서 교차 결합이없는 것입니다.

하지만 Cross join undest에 대한 Presto 쿼리를 작성하는 방법에 대해 고민하고 있습니다.

교차 배열 결합을 사용하여 모든 배열 요소를 확장하고 선택하려면 어떻게합니까?

해결법

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

    1.여기에 그 예가 있습니다.

    여기에 그 예가 있습니다.

    with example(message) as (
    VALUES
    (json '{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'),
    (json '{"payload":[{"type":"c","value":"7"}, {"type":"b","value":"3"}]}')
    )
    
    
    SELECT
            n.type,
            avg(n.value)
    FROM example
    CROSS JOIN
        UNNEST(
                CAST(
                    JSON_EXTRACT(message,'$.payload')
                        as ARRAY(ROW(type VARCHAR, value INTEGER))
                        )
                    ) as x(n)
    WHERE n.type = 'b'
    GROUP BY n.type
    

    with는 메시지로 앨리어스 된 컬럼이있는 example이라는 이름의 공통 테이블 표현식 (CTE)을 정의합니다.

    VALUES는 축약 된 테이블 행 집합을 반환합니다.

    UNNEST는 단일 행의 열에서 배열을 가져 와서 배열의 요소를 여러 행으로 반환합니다.

    CAST는 JSON 유형을 UNNEST에 필요한 ARRAY 유형으로 변경합니다. 그것은 쉽게 ARRAY

    JSON_EXTRACT가 jsonPath 표현식을 사용하여 페이로드 키의 배열 값을 반환합니다.

    avg () 및 group by는 익숙한 SQL이어야합니다.

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

    2.당신이 지적했듯이, 이것은 Presto 0.79에서 최종적으로 구현되었습니다. :)

    당신이 지적했듯이, 이것은 Presto 0.79에서 최종적으로 구현되었습니다. :)

    다음은 여기에서 캐스트의 구문 예입니다.

    select cast(cast ('[1,2,3]' as json) as array<bigint>);
    

    Hive에있는 것처럼 Presto에는 'string'유형이 없습니다. 즉, 배열에 문자열이 포함되어있는 경우 type 'varchar'를 사용해야합니다. 그렇지 않으면 'type array does not exist'라는 오류 메시지가 나타나 오도 할 수 있습니다.

    select cast(cast ('["1","2","3"]' as json) as array<varchar>);
    
  3. ==============================

    3.문제는 이전 버전의 Presto를 실행하고 있다는 것입니다.

    문제는 이전 버전의 Presto를 실행하고 있다는 것입니다.

    unnest는 버전 0.79에서 추가되었습니다.

    https://github.com/facebook/presto/blob/50081273a9e8c4d7b9d851425211c71bfaf8a34e/presto-docs/src/main/sphinx/release/release-0.79.rst

  4. from https://stackoverflow.com/questions/29932950/how-to-cross-join-unnest-a-json-array-in-presto by cc-by-sa and MIT license