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)
代码说明
xpath(data, "/employees/person/name[@value='Alice']"):提取所有value属性为Alice的<name>节点(包括空节点)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)
代码说明
explode将节点数组拆分为单行记录- 对每个节点判断文本内容,空值替换为
NA collect_list将处理后的结果重新聚合为数组
内容的提问来源于stack exchange,提问作者loy
相关产品推荐
相关产品推荐

