提示
Hive SQL 教程 欢迎使用。提供建议、纠错、催更等加作者微信: gairuo123(备注:sql )和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Hive 对于网页 HTML (或 XML 结构)文本可以使用支持 XPath 表达的式自定义函数解析出相关内容。本页介绍的函数为使用 XPath 表达式解析XML数据的函数。
xpath 系列 UDF 是 Java xpath 库 javax 的包装器,由 javax.xml.xpath
JDK 提供。
所有函数都遵循以下形式:xpath_*(xml_string, xpath_expression_string)
。
给定 XPath 表达式,每个函数都返回一个特定的 Hive 类型:
XPath 表达式字符串被编译和缓存。 如果下一个输入行中的表达式与前一个匹配,则会重用它。 否则,将重新编译。 因此,xml 字符串始终针对每个输入行进行解析,但 xpath 表达式已预编译并用于绝大多数用例。
例如:
select xpath ('<a><b id="1"><c/></b><b id="2"><c/></b></a>','/descendant::c/ancestor::b/@id')
-- [1","2]
UDF 与模式无关 - 不执行 XML 验证。 但是,格式错误的 xml(例如,<a><b>1</b></aa>
)将导致抛出运行时异常。
以下是每个 xpath UDF 变体的详细信息。
xpath() 函数始终返回一个 hive 字符串数组。如果表达式产生非文本值(例如,另一个 xml 节点),则函数将返回一个空数组。此函数有 2 个主要用途:获取节点文本值列表或获取属性值列表。
例子:
不匹配的 XPath 表达式:
> select xpath('<a><b>b1</b><b>b2</b></a>','a/*')
[]
获取节点文本值列表:
> select xpath('<a><b>b1</b><b>b2</b></a>','a/*/text()')
[b1","b2]
获取属性“id”的值列表:
> select xpath('<a><b id="foo">b1</b><b id="bar">b2</b></a>','//@id')
['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()');
[b1","c1]
xpath_string() 函数返回第一个匹配节点的文本。
获取节点“a/b”的文本:
> SELECT xpath_string ('<a><b>bb</b><c>cc</c></a>', 'a/b')
bb
获取节点“a”的文本。因为 'a' 有带有文本的子节点,所以结果是来自子节点的文本的组合。
> SELECT xpath_string ('<a><b>bb</b><c>cc</c></a>', 'a')
bbcc
不匹配的表达式返回一个空字符串:
> SELECT xpath_string ('<a><b>bb</b><c>cc</c></a>', 'a/d')
获取匹配 '//b' 的第一个节点的文本:
> SELECT xpath_string ('<a><b>b1</b><b>b2</b></a>', '//b')
b1
获取第二个匹配节点:
> SELECT xpath_string ('<a><b>b1</b><b>b2</b></a>', 'a/b[2]');
b2
从第一个具有属性 'id' 和值 'b_2' 的节点获取文本:
> SELECT xpath_string ('<a><b>b1</b><b id="b_2">b2</b></a>', 'a/b[@id="b_2"]');
b2
如果 XPath 表达式的计算结果为 true,或者找到匹配的节点,则返回 true。
找到匹配:
> SELECT xpath_boolean ('<a><b>b</b></a>', 'a/b')
true
未找到匹配项:
> SELECT xpath_boolean ('<a><b>b</b></a>', 'a/c')
false
找到匹配:
> SELECT xpath_boolean ('<a><b>b</b></a>', 'a/b = "b"')
true
未找到匹配项:
> SELECT xpath_boolean ('<a><b>10</b></a>', 'a/b < 10')
false
这些函数返回一个整数数值,如果没有找到匹配项,或者找到匹配项但该值不是数字,则返回零值。
支持数学运算。如果值溢出返回类型,则返回该类型的最大值。
没有匹配:
> SELECT xpath_int ('<a>b</a>', 'a = 10')
0
非数字匹配:
> SELECT xpath_int ('<a>this is not a number</a>', 'a')
0
> SELECT xpath_int ('<a>this 2 is not a number</a>', 'a')
0
添加值:
> 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/*)')
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)')
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"])')
5
溢出:
> SELECT xpath_int ('<a><b>2000000000</b><c>40000000000</c></a>', 'a/b * a/c')
2147483647
类似于 xpath_short、xpath_int 和 xpath_long,但具有浮点语义。不匹配结果为零。然而,
非数字匹配结果为 NaN。请注意,xpath_number() 是 xpath_double() 的别名。
没有匹配:
> SELECT xpath_double ('<a>b</a>', 'a = 10')
0.0
非数字匹配:
> SELECT xpath_double ('<a>这不是一个数字</a>', 'a')
NaN
一个非常大的数字:
SELECT xpath_double ('<a><b>2000000000</b><c>40000000000</c></a>', 'a/b * a/c')
8.0E19
更新时间:2022-06-17 17:11:49 标签:hive sql xpath