Использовать рекурсивное глобирование для извлечения документов XML в виде строк в pyspark - PullRequest
0 голосов
/ 18 мая 2018

Цель состоит в том, чтобы извлечь документы XML с выражением XPath из группы текстовых файлов в виде строк.Сложность заключается в том, что формы текстовых файлов могут различаться. Может быть:

  • один файл zip / tar с 100 файлами, каждый 1 документ XML
  • один файл с 100XML-документы (совокупный документ)
  • один файл zip / tar, с разными уровнями каталогов, с отдельными XML-записями в виде файлов и совокупными XML-файлами

Я думал, что нашел решениес библиотекой Spark Spark-XML Databrick , так как она обрабатывает рекурсивное сглаживание при чтении файлов.Это было прекрасно.Может сделать что-то вроде:

# read directory of loose files
df = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='mods:mods').load('file:///tmp/combine/qs/mods/*.xml')

# recursively discover and parse
df = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='mods:mods').load('file:///tmp/combine/qs/**/*.xml')

# even read archive files without additional work
df = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='mods:mods').load('file:///tmp/combine/mods_archive.tar')

Проблема, эта библиотека ориентирована на синтаксический анализ записей XML в столбцы DataFrame, где моя цель - извлечь только XML-документы в виде строк для хранения.

Мой scala не достаточно силен, чтобы легко взломать библиотеку Spark-XML, чтобы использовать рекурсивное копирование и захват документов XPath, но пропуская синтаксический анализ и вместо этого сохраняя всю запись XML в виде строки.

Библиотека поставляетсяс возможностью сериализации DataFrames в XML, но сериализация определенно отличается от ввода (что в некоторой степени следует ожидать).Например, текстовые значения элемента становятся атрибутами элемента.Принимая во внимание следующий исходный XML:

<mods:role>
    <mods:roleTerm authority="marcrelator" type="text">creator</mods:roleTerm>
</mods:role>

, читая, а затем сериализуя с возвратами Spark-XML:

<mods:role>
    <mods:roleTerm VALUE="creator" authority="marcrelator" type="text"></mods:roleTerm>
</mods:role>

Однако, даже если бы я мог получить сериализацию VALUE как фактическуюзначение элемента, я до сих пор не достигаю своей конечной цели - иметь эти XML-документы, которые были обнаружены и прочитаны с помощью превосходного разброса Spark-XML и выбора XPath, просто как строки.

Любое понимание будет оценено.

1 Ответ

0 голосов
/ 21 мая 2018

Нашел решение из этой проблемы Databricks Spark-XML :

xml_rdd = sc.newAPIHadoopFile('file:///tmp/mods/*.xml','com.databricks.spark.xml.XmlInputFormat','org.apache.hadoop.io.LongWritable','org.apache.hadoop.io.Text',conf={'xmlinput.start':'<mods:mods>','xmlinput.end':'</mods:mods>','xmlinput.encoding': 'utf-8'})

Ожидается 250 записей и получено 250 записей.Простой RDD со всей записью XML в виде строки:

In [8]: xml_rdd.first()
Out[8]: 
(4994,
 '<mods:mods xmlns:mets="http://www.loc.gov/METS/" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openarchives.org/OAI/2.0/" version="3.0">\n\n\n               <mods:titleInfo>\n\n\n                  <mods:title>Jessie</mods:title>\n\n\n...
...
...

Благодарю сопровождающего (-ых) Spark-XML за прекрасную библиотеку и внимательность к проблемам.

...