使用PySpark读取XML文件时出现corrupt_record问题
PySpark读取XML文件仅返回corrupt_records列的解决方案
问题根源
你执行以下代码读取XML文件时,DataFrame仅生成corrupt_records列:
df_xml=spark.read.format("com.databricks.spark.xml").option("rootTag","dataset").option("rowTag","AUTHOR").load(FilePath)
核心问题是XML文件不符合语法规范:AUTHOR标签的AUTHOR_UID属性值未用引号包裹(如AUTHOR AUTHOR_UID = 1),XML标准要求所有属性值必须被单引号或双引号包裹,这直接导致Spark XML解析器无法识别文件结构,进而标记所有记录为损坏。
解决方案
方案1:修正XML文件格式(最可靠)
给所有属性值添加引号,修改后的XML示例:
<?xml version='1.0' encoding='UTF-8'?> <dataset> <AUTHOR AUTHOR_UID="1"> <FIRST_NAME>Fiona</FIRST_NAME> <MIDDLE_NAME/> <LAST_NAME>Macdonald</LAST_NAME> </AUTHOR> <AUTHOR AUTHOR_UID="2"> <FIRST_NAME>Gian</FIRST_NAME> <MIDDLE_NAME>Paolo</MIDDLE_NAME> <LAST_NAME>Faleschini</LAST_NAME> </AUTHOR> <AUTHOR AUTHOR_UID="3"> <FIRST_NAME>Laura</FIRST_NAME> <MIDDLE_NAME>K</MIDDLE_NAME> <LAST_NAME>Egendorf</LAST_NAME> </AUTHOR> <AUTHOR AUTHOR_UID="4"> <FIRST_NAME>Jan</FIRST_NAME> <MIDDLE_NAME/> <LAST_NAME>Grover</LAST_NAME> </AUTHOR> </dataset>
重新运行原代码即可正常解析,此时DataFrame会包含AUTHOR_UID、FIRST_NAME、MIDDLE_NAME、LAST_NAME列。
方案2:通过参数尝试兼容非标准XML(可选)
如果无法修改原XML文件,可尝试指定解析模式和属性前缀,让解析器尽可能读取内容:
df_xml = spark.read.format("com.databricks.spark.xml") \ .option("rootTag", "dataset") \ .option("rowTag", "AUTHOR") \ .option("mode", "PERMISSIVE") \ .option("attributePrefix", "_") \ .load(FilePath)
注意:这种方法依赖解析器对非标准语法的容忍度,稳定性不如修正XML格式。
内容的提问来源于stack exchange,提问作者Ankit Tyagi
相关产品推荐
相关产品推荐

