On this page
UDAFs
与 XPath 相关的内置用户定义功能的文档
UDFs
xpath,xpath_short,xpath_int,xpath_long,xpath_float,xpath_double,xpath_number,xpath_string
使用 XPath 表达式解析 XML 数据的函数。
自版本:0.6.0
Overview
UDF 的* xpath *系列是 JDK 提供的 Java XPath 库javax.xml.xpath
的包装。该库基于 XPath 1.0 规范。有关 Java XPath 库的详细信息,请参考http://java.sun.com/javase/6/docs/api/javax/xml/xpath/package-summary.html。
所有功能均遵循以下格式:xpath_*(xml_string, xpath_expression_string)
。 XPath 表达式字符串将被编译和缓存。如果下一个 Importing 行中的表达式与上一个匹配,则可以重用该表达式。否则,将重新编译它。因此,总是为每个 Importing 行都解析 xml 字符串,但是 xpath 表达式已被预编译并在绝大多数用例中重新使用。
支持后轴。例如:
> select xpath ('<a><b id="1"><c/></b><b id="2"><c/></b></a>','/descendant::c/ancestor::b/@id') from t1 limit 1 ;
[1","2]
给定 XPath 表达式,每个函数都返回特定的 Hive 类型:
xpath
返回 Hive 字符串数组。xpath_string
返回一个字符串。xpath_boolean
返回一个布尔值。xpath_short
返回一个短整数。xpath_int
返回一个整数。xpath_long
返回一个长整数。xpath_float
返回浮点数。xpath_double,xpath_number
返回双精度浮点数(xpath_number
是xpath_double
的别名)。
UDF 与模式无关-不执行 XML 验证。但是,格式不正确的 xml(例如<a><b>1</b></aa>
)将导致抛出运行时异常。
以下是每个 xpath UDF 变体的详细信息。
xpath
xpath()
函数始终返回一个 Hive 字符串数组。如果表达式的结果为非文本值(例如,另一个 xml 节点),则该函数将返回一个空数组。此功能有 2 个主要用途:获取节点文本值列表或获取属性值列表。
Examples:
不匹配的 XPath 表达式:
> select xpath('<a><b>b1</b><b>b2</b></a>','a/*') from src limit 1 ;
[]
获取节点文本值的列表:
> select xpath('<a><b>b1</b><b>b2</b></a>','a/*/text()') from src limit 1 ;
[b1","b2]
获取属性“ id”的值列表:
> select xpath('<a><b id="foo">b1</b><b id="bar">b2</b></a>','//@id') from src limit 1 ;
[foo","bar]
获取“ class”属性等于“ bb”的节点的节点文本列表:
> SELECT xpath ('<a><b class="bb">b1</b><b>b2</b><b>b3</b><c class="bb">c1</c><c>c2</c></a>', 'a/*[@class="bb"]/text()') FROM src LIMIT 1 ;
[b1","c1]
xpath_string
xpath_string()
函数返回第一个匹配节点的文本。
获取节点“ a/b”的文本:
> SELECT xpath_string ('<a><b>bb</b><c>cc</c></a>', 'a/b') FROM src LIMIT 1 ;
bb
获取节点“ a”的文本。因为“ a”具有带有文本的子节点,所以结果是来自子节点的文本的组合。
> SELECT xpath_string ('<a><b>bb</b><c>cc</c></a>', 'a') FROM src LIMIT 1 ;
bbcc
不匹配的表达式返回一个空字符串:
> SELECT xpath_string ('<a><b>bb</b><c>cc</c></a>', 'a/d') FROM src LIMIT 1 ;
获取与“ // b”匹配的第一个节点的文本:
> SELECT xpath_string ('<a><b>b1</b><b>b2</b></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
从第一个节点获取具有值为“ b_2”的属性“ id”的文本:
> SELECT xpath_string ('<a><b>b1</b><b id="b_2">b2</b></a>', 'a/b[@id="b_2"]') FROM src LIMIT 1 ;
b2
xpath_boolean
如果 XPath 表达式的计算结果为 true,或者找到匹配的节点,则返回 true。
Match found:
> SELECT xpath_boolean ('<a><b>b</b></a>', 'a/b') FROM src LIMIT 1 ;
true
找不到匹配项:
> SELECT xpath_boolean ('<a><b>b</b></a>', 'a/c') FROM src LIMIT 1 ;
false
Match found:
> SELECT xpath_boolean ('<a><b>b</b></a>', 'a/b = "b"') FROM src LIMIT 1 ;
true
找不到匹配项:
> SELECT xpath_boolean ('<a><b>10</b></a>', 'a/b < 10') FROM src LIMIT 1 ;
false
xpath_short,xpath_int,xpath_long
这些函数返回整数数字值,如果找不到匹配项,或者找到匹配项但值为非数字,则返回零值。
支持 math 运算。如果值溢出了返回类型,则返回该类型的最大值。
No match:
> SELECT xpath_int ('<a>b</a>', 'a = 10') FROM src LIMIT 1 ;
0
Non-numeric match:
> SELECT xpath_int ('<a>this is not a number</a>', 'a') FROM src LIMIT 1 ;
0
> SELECT xpath_int ('<a>this 2 is not a number</a>', 'a') FROM src LIMIT 1 ;
0
Adding values:
> SELECT xpath_int ('<a><b class="odd">1</b><b class="even">2</b><b class="odd">4</b><c>8</c></a>', 'sum(a/*)') FROM src LIMIT 1 ;
15
> SELECT xpath_int ('<a><b class="odd">1</b><b class="even">2</b><b class="odd">4</b><c>8</c></a>', 'sum(a/b)') FROM src LIMIT 1 ;
7
> SELECT xpath_int ('<a><b class="odd">1</b><b class="even">2</b><b class="odd">4</b><c>8</c></a>', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ;
5
Overflow:
> SELECT xpath_int ('<a><b>2000000000</b><c>40000000000</c></a>', 'a/b * a/c') FROM src LIMIT 1 ;
2147483647
xpath_float,xpath_double,xpath_number
与 xpath_short,xpath_int 和 xpath_long 相似,但具有浮点语义。不匹配结果为零。然而,
非数字匹配结果为 NaN。请注意,xpath_number()
是xpath_double()
的别名。
No match:
> SELECT xpath_double ('<a>b</a>', 'a = 10') FROM src LIMIT 1 ;
0.0
Non-numeric match:
> SELECT xpath_double ('<a>this is not a number</a>', 'a') FROM src LIMIT 1 ;
NaN
大量:
SELECT xpath_double ('<a><b>2000000000</b><c>40000000000</c></a>', 'a/b * a/c') FROM src LIMIT 1 ;
8.0E19