Как разобрать фрейм данных, содержащий строки xml?

Как разобрать xml-файл, содержащий xml-данные, в одном из его столбцов?

В одном из наших проектов мы получаем xml файлы, в которых часть столбцов хранит другой xml. При загрузке этих данных в кадр данных внутренний xml преобразуется в StringType (что не предназначено), поэтому невозможно получить доступ к узлам при запросе данных (используя оператор точки).

Я искал ответы в сети, но безуспешно. Нашел одну открытую проблему, точно идентичную моему варианту использования в GitHub. Ссылка здесь.

https://github.com/databricks/spark-xml/issues/140

Мой исходный файл xml выглядит следующим образом.

+------+--------------------+
|  id  |               xml  |
+------+--------------------+
| 6723 |<?xml version="1....|
| 6741 |<?xml version="1....|
| 6774 |<?xml version="1....|
| 6735 |<?xml version="1....|
| 6828 |<?xml version="1....|
| 6764 |<?xml version="1....|
| 6732 |<?xml version="1....|
| 6792 |<?xml version="1....|
| 6754 |<?xml version="1....|
| 6833 |<?xml version="1....|
+------+--------------------+

В SQL Server для хранения xml в столбце базы данных существует тип данных XML, но его нет в Spark SQL.

Кто-нибудь сталкивался с той же проблемой и нашел обходной путь? Если да, пожалуйста, поделитесь. Мы используем Spark Scala.


person Gourav Dutta    schedule 08.01.2018    source источник
comment
Привет, Гурав, ты нашел обходной путь?   -  person devanathan    schedule 24.05.2018
comment
Пожалуйста, обратитесь по этой ссылке stackoverflow.com/questions/52078230/ У меня тоже была такая же проблема.   -  person Rajkiran    schedule 21.09.2018


Ответы (1)


Вы можете использовать что-то вроде ниже:

df.withColumn("ID", split(col("xml"), ",").getItem(1))

где ID — это новое имя поля, а в

col("xml")

xml – это имя поля кадра данных.
"," – разделены запятой-разделителем (используйте по требованию)

person Amit Dass    schedule 27.05.2018