我正在读取一个XML文件,其中包含许多特殊字符,例如“&”。我已经编写了以下示例代码来读取该XML文件:
from pyspark.sql import SparkSession
def main():
spark = SparkSession.builder.master("local[*]").appName("XMLParsingWithSpark").getOrCreate()
df = spark.read.format('com.databricks.spark.xml').options(rowTag='book').load('../tests/books1.xml')
df.show()
df.select("author", "_id").write.format('com.databricks.spark.xml').options(rowTag='book', rootTag='books').save('../tests/newbooks.xml')
# entry point for PySpark application
if __name__ == '__main__':
main()
我的books1.xml文件如下:
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's & Guide</title>
<description>Oracle Streams Advanced Queuing XMLType support.</description>
</book>
<book id="bk102">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<description>The two daughters & of Maeve, half-sisters.</description>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<description>After the collapse of a nanotechnology.</description>
</book>
当我使用:运行我的Spark作业时
spark-submit --packages com.databricks:spark-xml_2.11:0.5.0 XMLParsing.py
It generates me following result:
+--------------------+-----+-----------+--------------------+---------------+
| _corrupt_record| _id| author| description| title|
+--------------------+-----+-----------+--------------------+---------------+
|<book id="bk101">...| null| null| null| null|
|<book id="bk102">...| null| null| null| null|
| null|bk103|Corets, Eva|After the collaps...|Maeve Ascendant|
+--------------------+-----+-----------+--------------------+---------------+
最终输出文件:
<books>
<book></book>
<book></book>
<book id="bk103">
<author>Corets, Eva</author>
</book>
</books>
前两个记录具有 _corrupt_record ,因为很少有字段在XML中具有“&” 导致此问题。
现在我想了解在使用pyspark解析XML时如何处理此类问题?
到目前为止,我想到的一个选择是将“&”替换为 在将数据文件推送到HDFS之前先使用“ and” [sed -i -e's /&/ and / g'] 在我的程序中使用文件之前。
另一个选择是将文件推送到HDFS上并替换所有 使用map-reduce或pyspark将“&”与“ and”的存在 [rdd-map-replace:寻求的东西]。
使用DROPMALFORMED选项作为模式,但这可能会导致整体 如果大多数/所有元素都带有“&”,则数据集为空白
在使用pyspark处理XML / JSON或任何其他文件时,是否可以处理这种情况? 在我大多数地方的原始数据集中,我遇到这样的问题。
任何帮助/参考将不胜感激。
谢谢。