Pysparkライブラリの中にある、coalesce()の挙動が理解できません。
下記に画像で、例を示します。
両方とも同じ挙動なのですが、ここで、coalesce(1)を使う理由は、何か考えられますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
RDDが複数のパーティションに分割されている場合saveAsTextFile
すると、複数のファイルができます。
1つのファイルで出力したい時にはcoalesce(1)
します。
http://spark.apache.org/docs/2.4.0/api/python/pyspark.html#pyspark.RDD.coalesce
sc.parallelize(range(30), 5).saveAsTextFile('save_files')
の結果
$ ls save_files/ _SUCCESS part-00000 part-00001 part-00002 part-00003 part-00004
sc.parallelize(range(30), 5).coalesce(1).saveAsTextFile('save_one')
の結果
$ ls save_one/ _SUCCESS part-00000
あるいはDataFrameだと、
rdd = sc.parallelize(map(lambda x: (x,), range(30)), 5) df = sqlContext.createDataFrame(rdd) df.write.save('save_dir_df') df.coalesce(1).write.save('save_one_df')
の結果が、
$ ls save_dir_df/ _SUCCESS part-00000-02504364-0715-4f75-bc3b-b6260d94920c-c000.snappy.parquet part-00001-02504364-0715-4f75-bc3b-b6260d94920c-c000.snappy.parquet part-00002-02504364-0715-4f75-bc3b-b6260d94920c-c000.snappy.parquet part-00003-02504364-0715-4f75-bc3b-b6260d94920c-c000.snappy.parquet part-00004-02504364-0715-4f75-bc3b-b6260d94920c-c000.snappy.parquet $ ls save_one_df/ _SUCCESS part-00000-e2a82017-e3b6-4fe9-9196-8b2ee31cc4b1-c000.snappy.parquet
などとなります。
ローカル実行なので保存で確認しているだけですが、Sparkは分散実行するのがメインですから、RDDが複数ノードに分散している状態で操作すると作業も分散実行されます。(DataFrameの方はよく知りませんが同じではないかと)
coalesce(1)
は、分散しているデータを1つのノードに集める操作になります。
操作している対象のデータが分散されていなければ、coalesce(1)
に意味はありません。
投稿2019/01/08 10:56
総合スコア11209
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。