用PySp解析大型XML维基百科转储

2024-09-28 22:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将维基百科历史转储从XML解析到PySpark数据帧。当我在一个有1.6tb内存的集群上解析一个大文件(+100GB)时,我得到了OutOfMemoryError:请求的数组大小超过了VM限制错误(即使我正在使用集群中的整个RAM,并且我尝试了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”作为行标记,因为我需要一些信息,比如来自页面的标题和id(之后我想分解修订以获得每个修订的一行)。而且,我认为我得到这个错误是因为有些页面有太多的修订,它们不能适应节点上的下划线java数组。你知道吗

如果我使用:

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

一切正常,但我失去了有关网页的信息,如标题和id等

有人能提出另一种方法来解析XMLs吗?也许使用'revision'作为rowTag,但不知何故保持id和title远离'page'标记。提前谢谢。你知道吗


Tags: 文件iddftitle错误page集群数组