2017-01-05 3 views
0

以下のコードを使用して、Hiveでxmlデータを解析しています。私のxmlデータでは、いくつかのタグが繰り返されているので、タグを解析してハイブテーブルに配置するためにbrickhouse jarと外側のビューを使用しています。しかし、コードを実行しているときにエラーが発生しています。私が間違っていることを理解できないので、助けてください。Hiveで側面図を使用しているときの例外

コード:

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; 

エラー:

Caused by: java.lang.IndexOutOfBoundsException: Index: 7, Size: 7 at java.util.ArrayList.rangeCheck(ArrayList.java:635) at java.util.ArrayList.get(ArrayList.java:411) at com.ibm.spss.hive.serde2.xml.objectinspector.XmlListObjectInspector.getListElement(XmlListObjectInspector.java:79) at brickhouse.udf.collect.ArrayIndexUDF.evaluate(ArrayIndexUDF.java:59) at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186) at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77) at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluatorHead._evaluate(ExprNodeEvaluatorHead.java:44) at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77) at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:65) at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:77) ... 25 more

FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask MapReduce Jobs Launched: Stage-Stage-1: Map: 1 HDFS Read: 0 HDFS Write: 0 FAIL Total MapReduce CPU Time Spent: 0 msec

サンプル:

<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> 

私の実際のサンプルでは、​​サイズやCに巨大です繰り返されるこれらのタグを多く含んでいます。

+0

「medications_info7」のデータはどのように見えますか? 'numeric_range(size(statusCode))の代わりに' numeric_range(size(statusCode) - 1) 'を試してください。 – gobrewers14

+0

@ GoBrewers14ハイブに繰り返しタグを' struct'として入力したいと思います。どうやってやるの 。私を助けてください。 – animal

答えて

1

あなたはその情報を提供していないので、あなたのデータがHiveにどのように見えるのかわからないので、ここであなたのXMLをHiveにロードした方法です。

ローダー:あなたができる、地図 - セクションの下Hive-XML-SerDeドキュメントで

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 - アレイ、あなたは彼らが繰り返しタグを処理するために、アレイ構造を使用することを見ることができると4でそれらがマップを使用してサブタグの下のエントリを処理することを確認してください。したがって、entryInfoARRAY<MAP<STRING,STRING>>となります。

この配列を爆発させ、key/valsのように集めて、再結合することができます。

クエリ

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 

、あなたは基本的にこの質問を4回(onetwothreefour)を求めてきました。これは良い考えではありません。ただ一度聞いて、情報を追加して編集してください。

+0

お返事ありがとうございます。データをハイブテーブルにカラムワイズ形式で格納します。私の期待した結果を確認してくださいhttp://stackoverflow.com/questions/41462410/parse-repeating-xml-tags-in-hive – animal

+0

解決策を編集しました。基本的にこれと同じ3つの他の質問を削除してください。 – gobrewers14

+0

フロア(tmp/5)= 0 THEN 0 フロア(tmp/5)= 1 THEN 1 フロア(tmp/5)= 2 THEN 2'のように何をしているのか教えてください。私のために役立つだろう。また、私はTBLPROPERTIESの 'entryinfo'を開始タグと終了タグとして使用できますか? – animal

関連する問題