2

我有一个 xpath 查询(使用 hive),我想在其中显示所有书籍节点 id 属性值。

我的 Xpath 语句如下所示:

Select xpath_string (bookxml, '/catalog/book/@id') from bookxml;

当我在 hive 中运行它时,它只返回第一本书的 ID,而不是所有的值。你能建议一个改变,让我可以归还所有书的ID吗?

4

3 回答 3

5

我根本不知道 Hive,但我对这个问题很感兴趣,所以我在 Google 上搜索了“Hive xpath_string”,第一次点击的摘要是

给定 XPath 表达式,每个函数都返回一个特定的 Hive 类型:xpath 返回一个 Hive 字符串数组。xpath_string 返回一个字符串。xpath_boolean 返回...

所以我花了大约 2 秒钟才发现你想使用 xpath 函数而不是 xpath_string 函数。

我有时想知道是否有人在转向文档之前转向 StackOverflow...

于 2013-06-26T07:56:53.677 回答
0

正如迈克尔所说,问题出在 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)
于 2013-06-26T08:50:16.420 回答
0

描述功能扩展使生活更轻松。这绝对让事情变得清晰:

描述函数扩展路径字符串;

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"]
于 2017-04-30T18:09:03.897 回答