使用pyspark读取XML / JSON文件时,如何处理“&”或任何其他特殊字符?

时间:2019-03-14 13:39:36

标签: apache-spark pyspark apache-spark-sql pyspark-sql databricks

我正在读取一个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或任何其他文件时,是否可以处理这种情况? 在我大多数地方的原始数据集中,我遇到这样的问题。

任何帮助/参考将不胜感激。

谢谢。

0 个答案:

没有答案