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_numberxpath_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

UDTFs