2017-12-29 36 views
0

私はScalaとSparkを使用しており、XMLファイルを単一の文字列として読み込みたいと考えています。 これを行うには、すっきりとしたScala-ishの方法を見つけるのに苦労しています。Scala/SparkでHDFSからテキストファイルを読む

私が最初に考えたのは

val fileContents: RDD[String] = sparkContext.textfile(pathToFile) 
val combinedContents: String = fileContents.reduce((line1, line2) => line1 + line2) 

を使用していた。しかし、私は、これは文字列に含まれているXMLの整合性を保つことが重要である行の順序を維持する心配です。

私がHDFSでファイルを読むためにオンラインで見つけたその他のものは、廃止予定のメソッドを使用することです。何か案は?

+0

https://github.com/databricks/spark-xml – philantrovert

+0

これはコスト(サポート、と承認が付属していますように私は、私は非標準のライブラリを使用しないようしたいことができる場合管理など) xml管理はアプリケーションの後半にあり、文字列を入力する必要があります。私は現時点でxmlであることに本当に気をつけませんが、行の順序が重要であることを説明するだけです。 –

+0

なぜ 'fileContents.collect'はそれをしないのですか? – philantrovert

答えて

0

sc.textFileは「ソートされた行」のRDDを返します。 複数のファイルが指定されたパスにある場合、ファイルは(ファイル名の)アルファベット順でもパーティションに割り当てられます。結論として、sc.textFileは行の順序を保持します。

は、私の知る限りは、コレクト()メソッドの実装を見直し確認することができますよう、順序も保たれ、これを直接使用しない理由はありませんされています

sc.textFile(pathToFile).collect()

これは動作するはずです。

しかし、私が提案するソリューションは、哲学的にscalaのメソッドと同等のRDDメソッドzipWithIndexを使用しています(ドキュメントでは、順序を保つことは保証されていないため、コレクションの別の実装の準備をしたい場合)同じ名前。

だから私はこのようなものだろう:オプション

sc.textFile(pathToFile).zipWithIndex().collect().sortBy(_._2).map(_._1)

+0

sc.textFile(pathToFile).collect()は私が行ったことです。 textFile()からの注文に関する私の懸念が根拠がないように思えます。 –

0

を:

  1. がでファイル全体を読む:

sparkContext.wholeTextFiles(filePath)

しかし、もしオーバーヘッドのように見えます君はそのようなファイルはあまりありません。

  1. HDFSファイルシステムオブジェクトを取得し、ファイルをInputStreamとして読み込みます。利用できる多くの例:HDFS FileSystems API example
関連する問題