2017-08-18 8 views
-1

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: 出力はどうすれば&のスキーマのように見えるのですか?

  • 最適なオプション:

答えて

0

一つの簡単な方法が爆発使用することで、すべての3つのデータ構造の可能な要素を含むものDATAFRAME:各ため、rowTag

  • 醜いオプション3つのデータフレームの配列、1関数。あなたはContainedResourceListのため、rowTagセットとの完全なXMLを読み取る次いで得られたデータフレームであなたは私はあなたに感謝

  • +0

    を爆発する各タグの複数の列を追加することができます

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

    新しい列にデータフレームを爆発することができます提案されたソリューション提案されている "爆発的な"ソリューションは、小さなファイルでうまく機能します。しかし、これは大規模なファイル(24GB)で失敗します: 'java.lang.OutOfMemoryError:要求された配列サイズがVM制限を超えています ' このソリューションでは、ContainedResourceList全体が1つのレコードに読み込まれます。 ContainedResourceListにはcaが含まれています。 1000万サウンド録音ContainedResourceListのサイズはcaです。入力ファイルの1/3。 私は3つのホストクラスターごとに8GBのRAMをテストしました。より多くのRAMを使用することができましたが、1つのマスキンでファイル全体を読み込むために多くのRAMを使用することは、Sparkを使用する背後にある考えではありませんでした。 – JanDE

    関連する問題