【问题标题】:XPath expression not working in HiveXPath 表达式在 Hive 中不起作用
【发布时间】: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 尝试查询行 &lt;FIXML&gt; 时,它会崩溃。当我去掉 &lt;Information&gt; 和 &lt;Batch&gt; 元素时 - 表格按预期工作。

有什么方法可以将整段 XML 插入到我的表中的一行中?或者我还有其他选择吗?我宁愿不必从文件中解析出麻烦的元素,但作为最后的手段,我将不得不这样做。

【问题讨论】:

  • “失败”或“爆炸”不是很明确。你有例外吗?堆栈跟踪?还是查询根本不返回任何元素?
  • 这里另一个值得注意的事情是有一个默认的命名空间在起作用。
  • @helb,顺便说一下,//*[@RptId] 将是一个习惯用法,如果人们想查询持有属性的元素而不是属性本身。
  • XPath 查询本身或数据没有问题。我已经验证了我的 XML 是有效的,并且我的 Xpath 查询本身是好的。问题更多是 Hive 问题 - 每一行都被视为自己的 XML 文件,当我在前 2 行查找属性时 - 我的 Xpath 表达式自然会失败。

标签: xml xpath hive


【解决方案1】:

我的想法是在我的创建表上设置行由 \003(EOF 字符)终止,以便将整个文件读入单行。不幸的是,Hive 不支持这一点 - LINES TERMINATED BY only supports newline '\n' right now

目前看来最好的选择是预处理文件。

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多