Проблема Pyspark при загрузке XML-файлов с помощью com.databricks: spark-xml - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь заставить некоторые академические POC работать с pyspark с помощью com.databricks: spark-xml.Цель состоит в том, чтобы загрузить xml-формат Stack Exchange Data Dump (https://archive.org/details/stackexchange) в pyspark df.

. Он работает как шарм с правильно отформатированным xml с правильными тегами, но завершается с ошибкой Stack Exchange Dump следующим образом:

<users>
  <row Id="-1" Reputation="1" CreationDate="2014-07-30T18:05:25.020" DisplayName="Community" LastAccessDate="2014-07-30T18:05:25.020" Location="on the server farm" AboutMe=" I feel pretty, Oh, so pretty" Views="0" UpVotes="26" DownVotes="701" AccountId="-1" />
</users>

В зависимости от корневого тега, тега строки я получаю пустую схему или ... что-то:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

df = sqlContext.read.format('com.databricks.spark.xml').option("rowTag", "users").load('./tmp/test/Users.xml')
df.printSchema()
df.show()

root
 |-- row: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _AboutMe: string (nullable = true)
 |    |    |-- _AccountId: long (nullable = true)
 |    |    |-- _CreationDate: string (nullable = true)
 |    |    |-- _DisplayName: string (nullable = true)
 |    |    |-- _DownVotes: long (nullable = true)
 |    |    |-- _Id: long (nullable = true)
 |    |    |-- _LastAccessDate: string (nullable = true)
 |    |    |-- _Location: string (nullable = true)
 |    |    |-- _ProfileImageUrl: string (nullable = true)
 |    |    |-- _Reputation: long (nullable = true)
 |    |    |-- _UpVotes: long (nullable = true)
 |    |    |-- _VALUE: string (nullable = true)
 |    |    |-- _Views: long (nullable = true)
 |    |    |-- _WebsiteUrl: string (nullable = true)

+--------------------+
|                 row|
+--------------------+
|[[Hi, I'm not ......|
+--------------------+
Spark          : 1.6.0
Python         : 2.7.15
Com.databricks : spark-xml_2.10:0.4.1

Я был бы чрезвычайно признателен за любыесоветовать.

С уважением, P.

1 Ответ

0 голосов
/ 02 декабря 2018

Некоторое время назад я попробовал тот же метод (spark-xml для файлов дампа stackoverflow), и мне это не удалось ... В основном потому, что DF рассматривается как массив структур и производительность обработки была действительно плохой.Вместо этого я рекомендую использовать стандартную программу чтения текста и отображать Key = "Value" в каждой строке с UDF следующим образом:

pattern = re.compile(' ([A-Za-z]+)="([^"]*)"')
parse_line = lambda line: {key:value for key,value in pattern.findall(line)}

Вы также можете использовать мой код для получения правильных типов данных: https://github.com/szczeles/pyspark-notebooks/blob/master/stackoverflow/stackexchange-convert.ipynb (схема соответствует дампам за март 2017 года).

...