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