使用多个行标记在Spark中读取XML文件

问题描述:

我想将带有3个不同RowTags的巨大XML文件读取到Apache Spark Dataframes中。使用多个行标记在Spark中读取XML文件

RowTag = XML元素,您将其解释为Spark中的一行。

的标签

  • 包含不同的数据结构
  • 不重叠

XML的火花(https://github.com/databricks/spark-xml)只提供阅读一个RowTag一段时间,所以我需要阅读相同的文件3次(不高效)。

有没有什么方法可以在一次读取中读取文件?

详情:

我有包含3列出了一个巨大的XML文件(24 GB):

<myFile> 
    <ContainedResourceList> 
     <SoundRecording><Title>A</Title></SoundRecording> 
     ... several million records ... 
     <SoundRecording><Title>Z</Title></SoundRecording> 
    </ContainedResourceList> 

    <ContainedReleaseList> 
     <Release><ReleaseType>Single</ReleaseType></Release> 
     ... several million records ... 
     <Release><ReleaseType>LP</ReleaseType></Release> 
    </ContainedReleaseList> 

    <ContainedTransactionList> 
     <Transaction><Sales>1</Sales></Transaction> 
     ... several million records ... 
     <Transaction><Sales>999</Sales></Transaction> 
    </ContainedTransactionList> 
</myFile> 

XML文件是有效的。 我想阅读RowTags SoundRecording,发布&事务。

我宁愿Scala libs,但我会很高兴任何使能阅读的库。

PS: 他的模式输出&怎么可能看起来像?

  • 最佳选择:对于每个RowTag
  • 丑陋期权3个DataFrames的数组,一个:一个包含所有3个数据结构的可能要素数据帧

一种简单的方法是使用爆炸功能。你可以用rowTag设置为ContainedResourceList阅读完整的XML,然后用得到的数据框爆炸数据框用新列

df.withColumn("soundRec", explode($"SoundRecording")) 

你可以为你想爆炸

+0

我感谢你们每个标签添加多个列为建议的解决方案。建议的“爆炸”解决方案适用于小文件。但它在一个巨大的文件(24 GB)上失败:'java.lang.OutOfMemoryError:请求的数组大小超过VM限制' 在此解决方案中,整个ContainedResourceList被读入一条记录。 ContainedResourceList包含ca. 1000万SoundRecordings。 ContainedResourceList大小为ca.输入文件的1/3。 我在3个主机群集上测试每个8GB RAM。我可以使用更多的RAM,但是为了在一台主机上读取整个文件而使用大量RAM并不是使用Spark的理念。 – JanDE