シナリオ: 入力は複数の小さな 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")