Разбор огромных дампов XML-Википедии с помощью PySpark - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь проанализировать дампы истории Википедии из XML в PySpark Dataframe. Когда я анализирую огромный файл (+ 100 ГБ) в кластере с 1,6 ТБ ОЗУ, я получаю OutOfMemoryError: Запрашиваемый размер массива превышает ошибку ограничения виртуальной машины (даже при использовании всей ОЗУ из кластера, и я попробовал несколько комбинаций executorMemory и MemoryOverhead). Файл XML имеет следующую структуру:

<mediawiki>
    <page>
        <id>1</id>
        <title>SomeTitle</title>
        <revision>... </revision>
        <revision>... </revision>
        <revision>... </revision>
        ...
    </page>
    <page>
        <id>2</id>
        <title>SomeTitle</title>
        <revision>... </revision>
        <revision>... </revision>
        <revision>... </revision>
        ...
    </page>
    ...
</mediawiki>

И мой код:

df = spark.read.format('xml').options(rowTag='page').load("xmlfile.xml")

Я хотел, чтобы 'page' был rowTag, потому что мне нужна некоторая информация, такая как title и id со страницы (после этого я хочу разбить ревизии, чтобы получить строку для ревизии). И я думаю, что получаю эту ошибку, потому что некоторые страницы имеют слишком много ревизий, и они не могут вписаться в нижележащий массив Java на узлах.

Если я использую:

df = spark.read.format('xml').options(rowTag='revision').load("xmlfile.xml")

все работает, но я теряю информацию о страницах, такую ​​как заголовок, идентификатор и т. Д.

Может ли кто-нибудь предложить альтернативный способ анализа XML-файлов? Может быть, использовать 'revision' в качестве rowTag, но каким-то образом сохранить идентификатор и заголовок из тега 'page'. Заранее спасибо.

...