You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark XPath查询如何为空文本节点返回默认值NA?

实现Spark XPath空文本节点返回默认值NA

可以实现,核心思路是先选中所有符合条件的<name>节点,再对每个节点判断是否存在有效文本,空节点则替换为'NA'。以下是两种可行方案:

方案一:使用Spark 3+的transform函数(推荐)

直接在selectExpr中通过transform遍历节点并处理空值:

sample_xml='<employees>\
    <person id="p1">\
        <name value="Alice">ALICE</name>\
    </person>\
    <person id="p2">\
        <name value="Alice">BOB</name>\
    </person>\
    <person id="p3">\
        <name value="Alice"/>\
    </person>\
</employees>'

data = [
  [f'{sample_xml}']  
    ]
df = spark.createDataFrame(data, ['data'])
df=df.selectExpr(
  'transform(xpath(data, "/employees/person/name[@value=\'Alice\']"), node -> if(string(node) != "", string(node), "NA")) as test'   
)
df.show(truncate=False)

代码说明

  1. xpath(data, "/employees/person/name[@value='Alice']"):提取所有value属性为Alice的<name>节点(包括空节点)
  2. transform(..., node -> if(string(node) != "", string(node), "NA")):遍历每个节点,用string(node)获取节点文本内容,空节点返回空字符串,判断后替换为NA

执行后输出结果:

+---------------------+
|test                 |
+---------------------+
|[ALICE, BOB, NA]     |
+---------------------+

方案二:兼容低版本Spark(无transform函数)

通过explode拆分节点列表,处理空值后再聚合:

sample_xml='<employees>\
    <person id="p1">\
        <name value="Alice">ALICE</name>\
    </person>\
    <person id="p2">\
        <name value="Alice">BOB</name>\
    </person>\
    <person id="p3">\
        <name value="Alice"/>\
    </person>\
</employees>'

data = [
  [f'{sample_xml}']  
    ]
df = spark.createDataFrame(data, ['data'])
df = df.selectExpr('explode(xpath(data, "/employees/person/name[@value=\'Alice\']")) as node') \
       .selectExpr('if(string(node) != "", string(node), "NA") as test') \
       .agg(collect_list('test').alias('test'))
df.show(truncate=False)

代码说明

  1. explode将节点数组拆分为单行记录
  2. 对每个节点判断文本内容,空值替换为NA
  3. collect_list将处理后的结果重新聚合为数组

内容的提问来源于stack exchange,提问作者loy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:09:26