3つの異なるRowTagsを持つ巨大なXMLファイルをApache Spark Dataframesに読み込みたいと思います。複数のRowTagsを持つSparkのXMLファイルを読む
RowTag = XML要素。これはSparkで行として解釈されます。
タグ
- は唯一のため、rowTagの時間を読むために提供しています
XML-スパーク(https://github.com/databricks/spark-xml)が重複していない別のデータ構造が含まれているので、私は読む必要があるでしょう同じファイル3回(効率的ではない)。
1つの読み込みでファイルを読み取る方法はありますか?
詳細:
<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ファイルが有効である:
私は3つのリストが含まれている巨大なXMLファイル(24ギガバイト)を持っています。 RowTags SoundRecording、Release &トランザクションを読んでいます。
私はScalaライブラリを好んでいますが、読み込みを有効にするライブラリがあればうれしいです。
PS: 出力はどうすれば&のスキーマのように見えるのですか?
- 最適なオプション:
を爆発する各タグの複数の列を追加することができます
新しい列にデータフレームを爆発することができます提案されたソリューション提案されている "爆発的な"ソリューションは、小さなファイルでうまく機能します。しかし、これは大規模なファイル(24GB)で失敗します: 'java.lang.OutOfMemoryError:要求された配列サイズがVM制限を超えています ' このソリューションでは、ContainedResourceList全体が1つのレコードに読み込まれます。 ContainedResourceListにはcaが含まれています。 1000万サウンド録音ContainedResourceListのサイズはcaです。入力ファイルの1/3。 私は3つのホストクラスターごとに8GBのRAMをテストしました。より多くのRAMを使用することができましたが、1つのマスキンでファイル全体を読み込むために多くのRAMを使用することは、Sparkを使用する背後にある考えではありませんでした。 – JanDE