Spark-XML解析XML时Lables字段为空及属性提取问题咨询
问题解答
1. 为什么Lables字段显示null?
当前配置未正确处理嵌套的<Lable>集合:
- Spark-XML默认不会自动将重复的子标签(比如多个
<Lable>)解析为数组,Lables作为父标签本身无文本内容,仅包含子元素,因此被识别为null。 - 你设置了
attributePrefix="",但未指定如何解析嵌套的子元素数组,导致内部<Lable>的属性未被正确读取。
2. 可以提取目标属性到DataFrame,调整代码即可
修改读取配置,结合Spark的DataFrame操作展开嵌套结构,示例代码如下:
# 读取XML,指定rowTag和解析嵌套数组的选项 df = spark.read.format("com.databricks.spark.xml") .option("rowTag", "IdentUebersetzung") .option("attributePrefix", "") .option("arrayElementName", "Lable") # 指定重复的子标签作为数组元素 .load("xxxxxx") # 展开Lables里的Lable数组,提取需要的属性 from pyspark.sql.functions import explode result_df = df.select( "IdentUebersetzungName", explode("Lables.Lable").alias("lable") ).select( "IdentUebersetzungName", "lable.ServiceShortName", "lable.LableName" ) result_df.show(truncate=False)
执行后会得到如下格式的结果:
+---------------------+------------------------------------------------+-----------+ |IdentUebersetzungName|ServiceShortName |LableName | +---------------------+------------------------------------------------+-----------+ |ABT |TABROW_OperaAndDisplUnit1SparePartNumbe |SGIDK2_HW | |ABT |TABROW_OperaAndDisplUnit1HardwNumbe |SGIDK2 | |ABT |TABROW_OperaAndDisplUnit1AppliSoftwVersiNumbe |ZIF | |ABT |TABROW_OperaAndDisplUnit1HardwVersiNumbe |BRIF | |ABT |TABROW_OperaAndDisplUnit1SeriaNumbe |SERNR | |Batt |Batt_ECUHardwNumbe |SGIDK2_HW | |Batt |Batt_SparePartNumbe |SGIDK2 | |Batt |Batt_ApplSwVerCount |ZIF | |Batt |Batt_ECUHardwVersiNumbe |BRIF | |Batt |Batt_SeriaNumbe |SERNR | +---------------------+------------------------------------------------+-----------+
补充说明
arrayElementName选项用来指定XML中重复出现的子标签,让Spark将其解析为数组类型,这样就能读取到<Lable>的属性。- 用
explode函数将数组展开为多行,之后就能直接提取每个<Lable>的属性字段了。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

