복붙노트

[HADOOP] 하이브에서 측면보기를 사용하는 동안 예외

HADOOP

하이브에서 측면보기를 사용하는 동안 예외

나는 Hive에서 xml 데이터를 파싱하기 위해 아래의 코드를 사용하고있다. 내 xml 데이터에서 몇 개의 태그가 반복되므로 벽돌 상자와 측면보기를 사용하여 태그를 파싱하고 하이브 테이블에 배치합니다. 그러나 코드를 실행할 때 오류가 발생합니다. 내가 뭘 잘못하고 있는지 이해할 수 없으니 도와주세요.

암호:

add jar /home/cloudera/brickhouse-0.5.5.jar;
CREATE TEMPORARY FUNCTION numeric_range AS 'brickhouse.udf.collect.NumericRange';
CREATE TEMPORARY FUNCTION array_index AS 'brickhouse.udf.collect.ArrayIndexUDF';
add jar /home/cloudera/hivexmlserde-1.0.5.3.jar;
set hive.exec.mode.local.auto=false;
DROP TABLE IF EXISTS medinfo2;
create table medinfo2 as
select array_index(statusCode,n) AS statusCode,
    array_index(startTime,n) AS startTime,
    array_index(endTime,n) AS endTime,
    array_index(strengthValue,n) AS strengthValue,
    array_index(strengthUnits,n) AS strengthUnits
from medications_info7 lateral view numeric_range(size( statusCode )) n1 as n;

오류:

견본:

<document>
 <code>10160-0</code>
 <entryInfo> 
    <statusCode>completed</statusCode>
    <startTime>20110729</startTime>
    <endTime>20110822</endTime>
    <strengthValue>24</strengthValue>
    <strengthUnits>h</strengthUnits>
 </entryInfo> 
 <entryInfo>
    <statusCode>completed</statusCode>
    <startTime>20120130</startTime>
    <endTime>20120326</endTime>
    <strengthValue>12</strengthValue>
    <strengthUnits>h</strengthUnits>
 </entryInfo>
 <entryInfo>
    <statusCode>completed</statusCode>
    <startTime>20100412</startTime>
    <endTime>20110822</endTime>
    <strengthValue>8</strengthValue>
    <strengthUnits>d</strengthUnits>
 </entryInfo>  
</document>

내 실제 샘플 크기가 크고 반복되는 이러한 태그가 많이 포함되어 있습니다.

해결법

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

    1.Hive에서 데이터가 어떻게 보이는지 알지 못합니다. 여기에 정보를 제공하지 않았으므로 여기에 XML을 하이브에로드하는 방법이 있습니다.

    Hive에서 데이터가 어떻게 보이는지 알지 못합니다. 여기에 정보를 제공하지 않았으므로 여기에 XML을 하이브에로드하는 방법이 있습니다.

    짐을 싣는 사람:

    ADD JAR /path/to/jar/hivexmlserde-1.0.5.3.jar;
    
    DROP TABLE IF EXISTS db.tbl;
    CREATE TABLE IF NOT EXISTS db.tbl (
      code STRING,
      entryInfo ARRAY<MAP<STRING,STRING>>
    )
    ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerde'
    WITH SERDEPROPERTIES (
      "column.xpath.code"="/document/code/text()",
      "column.xpath.entryInfo"="/document/entryInfo/*"
    )
    STORED AS
    INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
    TBLPROPERTIES (
      "xmlinput.start"="<document>",
      "xmlinput.end"="</document>"
    );
    
    LOAD DATA LOCAL INPATH 'someFile.xml' INTO TABLE db.tbl;
    

    섹션 3 - 배열의 Hive-XML-SerDe 문서에서 배열 구조를 사용하여 반복되는 태그를 처리하고 4 개의 맵에서 하위 태그 아래의 항목을 처리하기 위해 맵을 사용하는 것을 볼 수 있습니다. 따라서 entryInfo는 ARRAY > 유형이됩니다.

    그런 다음이 배열을 분해하고 키 / 값처럼 수집 한 다음 다시 결합 할 수 있습니다.

    질문:

    ADD JAR /path/to/jar/hivexmlserde-1.0.5.3.jar;
    ADD JAR /path/to/jars/brickhouse-0.7.1.jars;
    
    CREATE TEMPORARY FUNCTION COLLECT AS 'brickhouse.udf.collect.CollectUDAF';
    
    SELECT code
      , m_map['statusCode']    AS status_code
      , m_map['startTime']     AS start_time
      , m_map['endTime']       AS end_time
      , m_map['strengthValue'] AS strength_value
      , m_map['strengthUnits'] AS strength_units
    FROM (
      SELECT code
        , COLLECT(m_keys, m_vals) AS m_map
      FROM (
        SELECT code
          , idx
          , MAP_KEYS(entry_info_map)[0]   AS m_keys
          , MAP_VALUES(entry_info_map)[0] AS m_vals
        FROM (
          SELECT code
            , entry_info_map
            , CASE
               WHEN FLOOR(tmp / 5) = 0 THEN 0
               WHEN FLOOR(tmp / 5) = 1 THEN 1
               WHEN FLOOR(tmp / 5) = 2 THEN 2
               ELSE -1
             END AS idx
          FROM db.tbl
          LATERAL VIEW POSEXPLODE(entryInfo) exptbl AS tmp, entry_info_map ) x ) y
      GROUP BY code, idx ) z
    

    산출:

    code    status_code     start_time      end_time    strength_value  strength_units
    10160-0 completed       20110729        20110822    24              h
    10160-0 completed       20120130        20120326    12              h
    10160-0 completed       20100412        20110822    8               d
    

    또한 기본적으로이 질문을 네 번 (1, 2, 3, 4) 번씩했습니다. 이것은 좋은 생각이 아닙니다. 한번만 묻고, 더 많은 정보를 추가하고, 인내심을 가지고 편집하십시오.

  2. from https://stackoverflow.com/questions/41481582/exception-while-using-lateral-view-in-hive by cc-by-sa and MIT license