xml - Hadoop Hive XPaths仅返回阵列的一部分

标签 xml hadoop xpath xquery

我正在使用Hadoop Hive并尝试处理XML文件。该文件如下所示:

<asds4_0:SASDS>
<stl15:GetRS>
    <stl15:RS>
        <stl15:ORES>
            <stl15:ORE>
                <stl15:AccF>
                    <stl15:Transaction>
                        <stl15:Status>Hold</stl15:Status>
                    </stl15:Transaction>
                </stl15:AccF>
            </stl15:ORE>
            <stl15:ORE>
                <stl15:AccF>
                    <stl15:Transaction>
                        <stl15:Status>Active</stl15:Status>
                    </stl15:Transaction>
                </stl15:AccF>
            </stl15:ORE>
        </stl15:ORES>
    </stl15:RS>
</stl15:GetRS>
</asds4_0:SASDS>

我用来检索状态的xpath是:
SELECT
Status
FROM scenario1
LATERAL VIEW explode(xpath(cast(body as string),"//*[local-name()='SASDS']//*[local-name()='GetRS']//*[local-name()='RS']//*[local-name()='ORES']//*[local-name()='ORE']//*[local-name()='AccF']//*[local-name()='Transaction']//*[local-name()='Status']/text()")) adTable as Status

该xpath返回 Activity 状态和保持状态。问题是我只想检索 Activity 状态。
我尝试使用类似[[local-name()='Status'] ='Active']的内容(如https://www.w3schools.com/xml/xpath_syntax.asp所示),我仍然得到了Hold和Active这两个记录。

我不想在sql中使用WHERE Status ='Active',因为当我将其与其他字段结合使用时,它不返回所需的行。

最佳答案

首先,是否有任何特定原因导致您使用类似

*[local-name()='SASDS']

到处都是?它等效于(但可读性较差)
*:SASDS

此外,您在各处都使用//*,它返回并搜索所有后代元素。但是给定您的XML结构,您通常只想访问直接子级,因此再次使用/搜索子级更加可读(且速度更快)。

因此,最好是:
*:SASDS/*:GetRS/*:RS/*:ORES/*:ORE/*:AccF/*:Transaction/*:Status[. = "Active"]/text()

关于xml - Hadoop Hive XPaths仅返回阵列的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45348642/

相关文章:

hadoop - Hive Server2,直线无法理解

hadoop - completebulkload 执行 'copy' StoreFiles 而不是 'cut'

javascript - JQuery 的 XPath 选择器

html - XPath轴中的子代,后代和后代之间的差异

javascript - YQL 天气声明未显示某些物体,例如日出、日落和风寒

xml - XSL 在 for-each 中按属性查找元素

java - hdfs中的文件路径

python - 剥离 xpath 中的附加项

java - 排除 xpath 表达式中的子元素

java - 在android中覆盖/替换/res/values/color.xml