Как обрабатывать «&» или любой другой специальный символ при чтении файла XML / JSON с помощью pyspark? - PullRequest
0 голосов
/ 14 марта 2019

Я читаю 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-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, который вызвал эту проблему.

Теперь я хотел понять, как обрабатывать такие проблемы при разборе XML с помощью pyspark?

Один вариант, который мне приходит в голову сейчас, - это заменить "&" на "и" [sed -i -e 's / & / and / g'] перед отправкой файла данных в HDFS или перед использованием файла в моей программе.

Другим вариантом может быть передача файла в HDFS и замена всех существование "&" с "и" с использованием map-Reduce или Pyspark [rdd-map-replace: что-то из того, что искали].

Используйте опцию DROPMALFORMED в качестве режима, но это может привести к получению целого набор данных как пустой, если большинство / все элементы имеют "&"

Есть ли возможность обработки таких случаев при обработке XML / JSON или любого другого файла с использованием pyspark? В моем исходном наборе данных в большинстве мест у меня такая проблема.

Любая помощь / ссылки будут оценены.

Спасибо.

...