【发布时间】:2015-02-16 15:23:49
【问题描述】:
我希望将以下 XML 插入 Hive 表中,它以自己的文件上传到 HDFS。
<FIXML r="20030618" s="20040109" v="4.4" xr="FIA" xv="1" xmlns="http://www.fixprotocol.org/FIXML-4-4">
<Batch>
<Information RptID="23520135" BizDt="2015-01-20"></Information>
<Information RptID="23520378" BizDt="2015-01-20"></Information>
</Batch>
</FIXML>
这是我的 Hive 创建表
Create TABLE mydata(xmldata string)
LOCATION 'hdfs://nameservice1/user/john/mydata/';
Drop table mydataview;
CREATE table mydataview(RptID String, BizDt String);
insert overwrite table mydataview select xpath(xmldata ,'//@RptID'),xpath(xmldata ,'//@BizDt') from mydata;
使用上面的 XML 示例,最后一行(插入覆盖)将失败。我相信这是因为当我创建表 mydata 时,XML 的每一行都作为唯一的行插入到表中。因此,当 XPath 尝试查询行 <FIXML> 时,它会崩溃。当我去掉 <Information> 和 <Batch> 元素时 - 表格按预期工作。
有什么方法可以将整段 XML 插入到我的表中的一行中?或者我还有其他选择吗?我宁愿不必从文件中解析出麻烦的元素,但作为最后的手段,我将不得不这样做。
【问题讨论】:
-
“失败”或“爆炸”不是很明确。你有例外吗?堆栈跟踪?还是查询根本不返回任何元素?
-
这里另一个值得注意的事情是有一个默认的命名空间在起作用。
-
@helb,顺便说一下,
//*[@RptId]将是一个习惯用法,如果人们想查询持有属性的元素而不是属性本身。 -
XPath 查询本身或数据没有问题。我已经验证了我的 XML 是有效的,并且我的 Xpath 查询本身是好的。问题更多是 Hive 问题 - 每一行都被视为自己的 XML 文件,当我在前 2 行查找属性时 - 我的 Xpath 表达式自然会失败。