1. ホーム
  2. scala

[解決済み] saveAsTextFileで出力を複数ファイルに分割しないようにするには?

2023-07-24 22:36:21

質問

SparkでScalaを使用しているとき、結果をダンプするたびに saveAsTextFile を使って出力すると、出力が複数に分割されてしまうようです。パラメータ(path)を渡しているだけなんですけどね。

val year = sc.textFile("apat63_99.txt").map(_.split(",")(1)).flatMap(_.split(",")).map((_,1)).reduceByKey((_+_)).map(_.swap)
year.saveAsTextFile("year")

  1. 出力の数は使用するリデューサーの数に対応しているか?
  2. 出力は圧縮されているということでしょうか?
  3. bashを使って出力をまとめることができるのは知っていますが、出力を分割せずに1つのテキストファイルに保存するオプションはありますか?APIドキュメントを見ましたが、これについてはあまり書かれていません。

どのように解決するのですか?

複数のファイルとして保存されるのは、計算が分散されるからです。もし、出力が1台のマシンに収まると思われるほど小さいのであれば、プログラムの最後を

val arr = year.collect()

そして、できた配列をファイルとして保存します。 もう一つの方法は、カスタムパーティショナーを使用することです。 partitionBy を使用して、すべてを 1 つのパーティションにすることもできますが、並列化されないのでお勧めできません。

ファイルを保存する際に saveAsTextFile を使うことができます。 coalesce(1,true).saveAsTextFile() . これは基本的に、計算を行い、1つのパーティションに合体することを意味します。また repartition(1) の単なるラッパーです。 coalesce のラッパーで、shuffle 引数が true に設定されています。のソースを見ると RDD.scala のソースを見ると、このようなことがほとんど分かってきますので、ぜひ見てみてください。