我用xpath语句在Hive中创建了一个视图,用于从包含xml数据的大型消息字符串中提取数据,这些数据来自Hive中的另一个表,该表加载了内部系统产生的日志文件中的数据。
日志文件包含以特定名称节点开始的各种事务,我的hive视图仅提取特定事务的数据,问题是查询结果返回与xpath语句匹配的数据,但也返回不匹配的行作为空数组。我只想返回与结果匹配的行,并在视图中使用'where'语句忽略其余行,仅查找事务类型。
我不是xpath 1.0大师,我正在努力寻找正确的xpath来找到根节点名称,在这种情况下'GetTrolleyDetails'然后将其转换为where's语句,要么忽略所有不匹配的,要么只有当事务名称匹配节点名称
我在下面提供了一个我正在处理的事务示例;
<GetTrolleyDetails xmlns="http://tempuri.org/">
<accountSession xmlns:b="http://schemas.datacontract.org/2004/07/ApplicationServices.DataContracts.Common" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<SessionId>59e1f5e1-ef7c-42bc-a236-4086a2aa6a72</b:SessionId>
<SessionToken i:nil="true">
</SessionToken>
</accountSession>
</GetTrolleyDetails>
视图中的xpath示例;
xpath_string(regexp_replace(message, 'xmlns="', 'xmlns:ns="'), '//accountSession/SessionId[text()]') as SessionId
没有完全理解这个问题,但如果你想使用where子句,我会使用existsNode:
SELECT (EXTRACT(XMLDATA),XPATH EXPRESSION)
FROM TABLE/VIEW
WHERE existsNode((XMLDATA), XPATH EXPRESSION) =1;
如果我完全理解这个条件,我会给出一个例子,但听起来你只想得到一个特定的交易,这将涉及到哪里部分。
Oracle文档:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions048.htm
我花了一些时间摆弄各种xpath表达式,最后找到了解决我自己问题的方法。
下面的xpath local-name(/*)')
返回GetTrolleyDetails
的根节点名称,当我在where子句中使用以下语句
where xpath_string(regexp_replace(message, 'xmlns="', 'xmlns:ns="'), 'local-name(/*)')='GetTrolleyDetails';
在我的结果中只返回与视图中的xpath匹配的结果。结果集中不再返回空数组这是目标