SparkでのXML処理 質問する

SparkでのXML処理 質問する

シナリオ: 入力は複数の小さな XML であり、これらの XML を RDD として読み取る必要があります。別のデータセットとの結合を実行して RDD を形成し、出力を XML として送信します。

Spark を使用して XML を読み取り、データを RDD としてロードすることは可能ですか? 可能な場合、XML はどのように読み取られますか。

サンプル XML:

<root>
    <users>
        <user>
              <account>1234<\account>
              <name>name_1<\name>
              <number>34233<\number>
         <\user>
         <user>
              <account>58789<\account>
              <name>name_2<\name>
              <number>54697<\number>
         <\user>    
    <\users>
<\root>

これはどのようにして RDD にロードされるのでしょうか?

ベストアンサー1

はい、可能ですが、詳細は取るアプローチによって異なります。

  • ファイルが小さい場合、おっしゃるとおり、最も簡単な解決策は を使用してデータをロードすることですSparkContext.wholeTextFiles。 は、RDD[(String, String)]最初の要素がパスで 2 番目のファイルの内容である としてデータをロードします。 次に、ローカル モードのように各ファイルを個別に解析します。
  • 大きなファイルの場合は、Hadoop 入力フォーマット
    • 構造が単純な場合は、を使用してレコードを分割できますtextinputformat.record.delimiter。簡単な例を次に示します。ここ入力はXMLではありませんが、どのように進めるかのアイデアを与えるはずです
    • それ以外の場合はMahoutがXmlInputFormat
  • 最後に、ファイルを読み込んでSparkContext.textFile後でパーティション間のレコードのスパンを調整することが可能になります。概念的には、スライディングウィンドウを作成するのと似たような意味です。レコードを固定サイズのグループに分割する:

    • パーティションを使用してmapPartitionsWithIndex、パーティション間で壊れたレコードを識別し、壊れたレコードを収集します。
    • mapPartitionsWithIndex壊れたレコードを修復するには秒数を使う

編集:

比較的新しいspark-xmlタグによって特定のレコードを抽出できるパッケージ:

val df = sqlContext.read
  .format("com.databricks.spark.xml")
   .option("rowTag", "foo")
   .load("bar.xml")

おすすめ記事