我有一个 xpath 查询(使用 hive),我想在其中显示所有书籍节点 id 属性值。
我的 Xpath 语句如下所示:
Select xpath_string (bookxml, '/catalog/book/@id') from bookxml;
当我在 hive 中运行它时,它只返回第一本书的 ID,而不是所有的值。你能建议一个改变,让我可以归还所有书的ID吗?
我根本不知道 Hive,但我对这个问题很感兴趣,所以我在 Google 上搜索了“Hive xpath_string”,第一次点击的摘要是
给定 XPath 表达式,每个函数都返回一个特定的 Hive 类型:xpath 返回一个 Hive 字符串数组。xpath_string 返回一个字符串。xpath_boolean 返回...
所以我花了大约 2 秒钟才发现你想使用 xpath 函数而不是 xpath_string 函数。
我有时想知道是否有人在转向文档之前转向 StackOverflow...
正如迈克尔所说,问题出在 xpath_string 函数上。
我创建了像这样的小样本文件
<catalog><book id="1"></book><book id="2"></book></catalog>
<catalog><book id="3"></book><book id="5"></book></catalog>
我围绕这个文件创建了外部表,如下所示:
CREATE EXTERNAL TABLE books (books_xml string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
LOCATION '/home/dino/Downloads/books';
当您使用 xpath_string 函数运行查询时,您只会得到第一个 ID,如下所示:
hive> select xpath_string(books_xml, '/catalog/book/@id') from books;
结果:
Mapred Local Task Succeeded . Convert the Join into MapJoin
OK
1
3
Time taken: 3.765 seconds, Fetched: 2 row(s)
如果您使用 xpath 函数运行相同的查询,您会得到以下结果:
hive> select xpath(books_xml, '/catalog/book/@id') from books;
结果:
Mapred Local Task Succeeded . Convert the Join into MapJoin
OK
["1","2"]
["3","5"]
Time taken: 4.512 seconds, Fetched: 2 row(s)
描述功能扩展使生活更轻松。这绝对让事情变得清晰:
描述函数扩展路径字符串;
xpath_string(xml, xpath) - 返回与 xpath 表达式匹配的第一个 xml 节点的文本内容示例:
SELECT xpath_string('<a><b>b</b><c>cc</c></a>','a/c') FROM src LIMIT 1;
>'cc'
SELECT xpath_string('<a><b>b1</b><b>b2</b></a>','a/b') FROM src LIMIT 1;
>'b1'
SELECT xpath_string('<a><b>b1</b><b>b2</b></a>','a/b[2]') FROM src LIMIT 1;
>'b2'
SELECT xpath_string('<a><b>b1</b><b>b2</b></a>','a') FROM src LIMIT 1;
>'b1b2'
描述功能扩展路径;
xpath(xml, xpath) - 返回与 xpath 表达式匹配的 xml 节点中的值的字符串数组示例:
SELECT xpath('<a><b>b1</b><b>b2</b><b>b3</b><c>c1</c><c>c2</c></a>', 'a/text()') FROM src LIMIT 1;
>[]
SELECT xpath('<a><b>b1</b><b>b2</b><b>b3</b><c>c1</c><c>c2</c></a>', 'a/b/text()') FROM src LIMIT 1;
>["b1","b2","b3"]
SELECT xpath('<a><b>b1</b><b>b2</b><b>b3</b><c>c1</c><c>c2</c></a>', 'a/c/text()') FROM src LIMIT 1;
>["c1","c2"]