使用Hive Query解析raw_xml属性中的嵌套XML(仅处理active为True的节点)
Hive Query解析带嵌套XML的ClassApplications数据(仅处理active="True"的Report)
嘿,我来帮你搞定这个Hive解析嵌套XML的需求!咱们的核心要求很明确:只处理<Report>节点中active属性为True的记录,然后解析它raw_xml字段里的嵌套XML内容对吧?
Hive本身提供了一系列xpath相关的UDF来处理XML数据,刚好能满足这个场景。下面直接上可用的查询示例,再一步步拆解说明:
SELECT -- 提取外层ClassApplications的基础属性(按需选择) xpath_string(class_app_xml, '/ClassApplications/@id') as app_id, xpath_string(class_app_xml, '/ClassApplications/@bundle_id') as bundle_id, -- 提取符合条件的Report的raw_xml内容 report_raw_xml, -- 解析raw_xml里的嵌套属性,这里以Response的Score属性为例 xpath_string(report_raw_xml, '/Response/@Score') as response_score, -- 解析嵌套节点属性,比如Student的Name属性 xpath_string(report_raw_xml, '/Response/Student/@Name') as student_name FROM ( -- 先拆分外层XML为单个Report节点,同时过滤有效记录 SELECT class_app_xml, xpath_string(report_node, './@raw_xml') as report_raw_xml FROM your_table_name -- 用xpath_array拆分所有Report节点为多行 LATERAL VIEW xpath_array(class_app_xml, '/ClassApplications/Reports/Report') report_nodes as report_node -- 只保留active属性为True的Report WHERE xpath_string(report_node, './@active') = 'True' ) filtered_reports;
关键部分解释:
- 拆分外层XML:用
xpath_array配合LATERAL VIEW,把<ClassApplications/Reports>下的所有<Report>节点拆分成单独的行,方便逐个处理每个Report记录。 - 过滤有效记录:通过
xpath_string(report_node, './@active')提取当前Report的active属性值,再用WHERE子句筛选出值为True的记录。 - 解析嵌套XML:先提取
raw_xml的字符串值,再用xpath_string直接解析这个嵌套XML——语法和处理外层XML完全一致,只要写对目标节点/属性的路径就行。
小提示:
- 如果
raw_xml里有转义字符(比如示例中的<、"),Hive的xpath函数会自动处理,不用手动替换。 - 要是需要提取数值型属性,可以用
xpath_int、xpath_float这类类型特定的UDF,比xpath_string更精准。
内容的提问来源于stack exchange,提问作者HadoopAddict
相关产品推荐
相关产品推荐

