Я читаю 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?
В моем исходном наборе данных в большинстве мест у меня такая проблема.
Любая помощь / ссылки будут оценены.
Спасибо.