我使用下面的代码来解析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;
错误:
引起:java.lang.IndexOutOfBoundsException:索引:7,大小: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) 在org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77) at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluatorHead._evaluate(ExprNodeEvaluatorHead.java:44) 在org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77) at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:65) 在org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:77) ......还有25个
失败:执行错误,从org.apache.hadoop.hive.ql.exec.mr.MapRedTask返回代码2 MapReduce工作推出: Stage-Stage-1:Map:1 HDFS读:0 HDFS写:0 FAIL 总MapReduce CPU使用时间:0毫秒
示例:
<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>
我的实际样本数量庞大,并且包含大量重复的标记。
答案 0 :(得分:1)
我不知道你的数据在Hive中是什么样的,因为你没有提供这些信息,所以这就是我如何将你的XML加载到Hive中。
<强>装载机强>:
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<MAP<STRING,STRING>>
。
然后你可以爆炸这个数组,像键/ val一样收集,并重新组合。
<强>查询强>:
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次这个问题(one,two,three,four)。这不是一个好主意。只需询问一次,编辑即可添加更多信息,并耐心等待。