前提
- Databricks上でPySparkを使用。
- データはparquet形式で月ごとにAzure Blobに保存されており、月ごとに読み込みながらExcel形式のファイルを生成する
- 保存先もAzure Blob
- 変数kは、2022/1から2022/6までのデータセット
- output_path_delivery_iは、year_mthに入っている2022/1から2022/6までの定数
実現したいこと
- 月ごとのparquet形式のファイルを月ごとのExcel形式のファイルとして目的のディレクトリへ保存したい。
- ループ処理を使って分かりやすいコードにしたい。
- 対象の年月は、2022/1から2022/6
発生している問題・エラーメッセージ
- 最終月の2022/6分のExcelファイルしか出力されない。
該当のソースコード
PySpark
1for i, k in zip(year_mth, dataset): 2 with tempfile.NamedTemporaryFile() as tmp_file: 3 # やむを得ない事情があり、一時ファイルを経由して出力しています。 4 with pandas.ExcelWriter(tmp_file.name, engine="openpyxl") as writer: 5 actual_data = spark.read.parquet( 6 (datamart_dir / "output" / "output2" / i).as_posix() 7 ) 8 actual_data.toPandas().to_excel(writer, sheet_name='actual', header=True, index=False) 9 shutil.copyfile( 10 tmp_file.name, convert_dbfs_path_to_local_path(output_path_delivery_i) 11 )
試したこと
for文の挿入位置を先頭にしたが、最終月のExcelファイルしか出力されない。
DatabricksやPySparkなどなどは門外漢ですが、コードだけ見て
- 変数kは利用されていない?
- output_path_delivery_i変数の値は不変?
のように見えますが、意図通りでしょうか?
ぱっと見た感じ、同じファイルに毎回上書き出力してしまってるように見えますね
> output_path_delivery_iは、year_mthに入っている2022/1から2022/6までの定数です。
の「2022/1から2022/6までの定数」とは、変数としては1つしか値を持てませんから意味がわかりません。
その定数を定義しているところを提示いただけますか。
> 変数iでコントロールしているはず
とありますが、変数iも処理の中で使われていませんよという指摘だと思います。
もしかして、 output_path_delivery_i の「i」がそれだということでしょうか? であればpythonの文法として間違えています。 最初の質問の答えを見たらわかるような気がします。
> 変数kは、2022/1から2022/6までのデータセットです。
ですが、処理の中で k がどこにも使われていませんよという指摘だと思います。
> output_path_delivery_iは、year_mthに入っている2022/1から2022/6までの定数です。
仮に定数「リスト」としたいのであれば、output_path_delivery(i)ではないでしょうか?
for文と1つ目のwith句の間でoutput_path_delivery_iのファイル名を含むpathを指定することで解決しました。
いろいろと示唆に富むコメントをいただき、ありがとうございました!
回答3件
あなたの回答
tips
プレビュー