Я пытаюсь проанализировать дампы истории Википедии из 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'. Заранее спасибо.