xpath 提取根名称节点,然后在 Hive SQL 中变成 where's 子句



我用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匹配的结果。结果集中不再返回空数组这是目标

最新更新