Python

PySparkでCSVファイル出力とパーティション分け

前回の記事ではPySparkでCSVファイルを読み込む方法をやりましたので、今回はCSVファイル出力をやりたいと思います。

ただし、ただCSVファイルに出力するだけでなく、PySparkらしく分散保存を体感しながら複数ファイルに分けたり、パーティションに分けて(データを複数のフォルダに分けて)保存する方法を紹介します。

というより、何も指定せずに保存すると複数のファイルに別れて保存されますので、その辺りをちゃんと指定できるようにしていきましょう!

 

とりあえずCSVファイル出力

まずはPySparkでの基本的なCSVファイル出力をやっていきます。

データはこのonline_retailデータを使います。

 

 

今、このdfという変数がSpark DataFrameになっていますので、こちらをCSVファイルで出力します。

Sparkでは一つのデータフレームでも分散保存していますので、このデータフレームを以下のように普通に保存するとどうなるでしょうか。

 

 

save()の中はCSVファイルを格納するフォルダ名です。

では、その保存先のフォルダ(今回は"save_dataframe")を見てみるとこのようになっています。

 

 

フォルダ内には3つのファイルがあり、_SUCCESSという空ファイルと、データが入っているCSVファイルが2つ入っていますね。

ポイントはCSVファイルが2つあることです。

特別なオプションなど付けずに保存しても、分散保存されていることがわかるかと思います。

 

一つのCSVファイルに出力

普通に保存すると複数のファイルに別れて保存されますので、1つのCSVにしたいときはどうすればいいかをやってみます。

方法としては、writeの前にcoalesce(1)と指定することです。そのほかは同じです。

 

 
こちらで保存すると、このように_SUCESSという空ファイルと1つのCSVファイルになっています。

 

 

パーティション(複数フォルダ)に分けてCSVファイル出力

では最後にパーティション分けして(複数フォルダに分けて)保存をしてみましょう。

そのための準備として、日付カラムを使って、"year", "month"カラムを新しく作り、この2つのカラムでパーティション分けして保存してみたいと思います。

 

 
はい、これでデータができました。

パーティションに分ける場合は、writeの後にpartitionByでパーティションに分けるカラムを指定します。

これで保存をするとどうなるでしょうか?

 

 
まずフォルダ構成はこのようになります。

 

 

今回のデータには、yearは2010か2011しかありませんので、まずフォルダが2010, 2011の2つになっています。

次に2011年のフォルダに移動すると、このように月ごとにさらにフォルダがあるかと思います。

 

 

1月のフォルダに移動すると、ようやくCSVファイルが現れます。

 

 

このように1つのSpark DataFrameが、パーティションに指定したカラムの値に応じてパーティション分け(フォルダ分け)されて保存されます。

それほど大きくないデータでしたらメリットはないかもですが、だんだんとデータが大きくなっていくとこのような分散保存の効果が聞いてくるかと思います。

おすすめ記事

1

お疲れさまです! 久しぶりの更新になってしまいましたが、僕が未経験からデータサイエンティストになるまでの転職活動の全記録を書き残しておきたいと思います。 僕は博士号を取得後に研究員として仕事をしていま ...

2

こんにちわ、さとしです! 気がつけばこのデータサイエンティスト転職から、1年が経とうとしています。 今はご時世的に外にも出られず、変化があまりない生活を送ったせいもあってか、なんかあっという間に1年が ...

3

データサイエンティストに転職して1年が経ち、いろいろな業務を経験させてもらいつつ、自分でもある程度本を読んできました。 仕事の話は下記の記事で書きましたが、自分で読んだ本については書いていないのでこの ...

-Python

Copyright© さとぶろぐ , 2022 All Rights Reserved Powered by AFFINGER5.