복붙노트

[HADOOP] 하이브 테이블의 데이터 행을 개별 행으로 가져 오려면 어떻게해야합니까?

HADOOP

하이브 테이블의 데이터 행을 개별 행으로 가져 오려면 어떻게해야합니까?

다음 형식의 데이터를 하이브 테이블로 가져 오려고합니다.

[
    {
      "identifier" : "id#1",
      "dataA" : "dataA#1"
    },
    {
      "identifier" : "id#2",
      "dataA" : "dataA#2"
    }
]

이처럼 여러 파일을 가지고 있고 각 {}이 테이블에 한 행을 형성하기를 원합니다. 이것이 제가 시도한 것입니다 :

CREATE EXTERNAL TABLE final_table(
    identifier STRING,
    dataA STRING
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION "s3://bucket/path_in_bucket/"

각 {}에 대해 단일 행을 생성하지는 않습니다. 나는 또한 시도했다.

CREATE EXTERNAL TABLE final_table(
    rows ARRAY< STRUCT<
    identifier: STRING,
    dataA: STRING
    >>
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION "s3://bucket/path_in_bucket/"

그러나 이것 역시 작동하지 않습니다. 각 레코드가 하이브 쿼리의 배열에있는 항목으로 배열로 입력되도록 지정하는 방법이 있습니까? 무엇에 대한 제안?

해결법

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

    1.데이터 파일의 JSON 레코드는 한 줄에 하나씩 나타나야하며 빈 줄은 NULL 레코드를 생성합니다.

    데이터 파일의 JSON 레코드는 한 줄에 하나씩 나타나야하며 빈 줄은 NULL 레코드를 생성합니다.

    이 json이 작동해야합니다.

    { "식별자": "id # 1", "dataA": "dataA # 1"}, { "식별자": "id # 2", "dataA": "dataA # 2"}

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

    2.여기 당신이 필요로하는 것이 있습니다.

    여기 당신이 필요로하는 것이 있습니다.

    방법 1 : 배열에 이름 추가

    데이터

    {"data":[{"identifier" : "id#1","dataA" : "dataA#1"},{"identifier" : "id#2","dataA" : "dataA#2"}]}
    

    SQL

    SET hive.support.sql11.reserved.keywords=false;
    
    CREATE EXTERNAL TABLE IF NOT EXISTS ramesh_test (
      data array<
        struct<
          identifier:STRING, 
          dataA:STRING
        >
      >
    )
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    LOCATION 'my_location';
    
    SELECT rows.identifier,
           rows.dataA
      FROM ramesh_test d
    LATERAL VIEW EXPLODE(d.data) d1 AS rows  ;
    

    산출

    방법 2 - 데이터 변경 없음

    데이터

    [{"identifier":"id#1","dataA":"dataA#1"},{"identifier":"id#2","dataA":"dataA#2"}]
    

    SQL

    CREATE EXTERNAL TABLE IF NOT EXISTS ramesh_raw_json (
      json STRING
    )
    LOCATION 'my_location';
    
    SELECT get_json_object (exp.json_object, '$.identifier') AS Identifier,
           get_json_object (exp.json_object, '$.dataA') AS Identifier
      FROM ( SELECT json_object
               FROM ramesh_raw_json a
               LATERAL VIEW EXPLODE (split(regexp_replace(regexp_replace(a.json,'\\}\\,\\{','\\}\\;\\{'),'\\[|\\]',''), '\\;')) json_exploded AS json_object ) exp;
    

    산출

  3. from https://stackoverflow.com/questions/47522270/how-do-i-import-an-array-of-data-into-separate-rows-in-a-hive-table by cc-by-sa and MIT license