たまのおもひで

好きなことに熱中し大抵すぐに生きがいになります。趣味と仕事となんでもないことも。

無料トライアル版に登録してAzure Databricks上でPythonコードを動かしてみる【PySpark】

Azure Databricksに触ったことのない私が、環境をいちから準備してPySparkでデータ分析をしてみよう! と試みた記事です。出来なかったこと、エラーで困ったことも含めて文章に残しておこうと思います。

1. アカウント作成からノートブックへの移動まで。

まずAzureの無料アカウントに登録する必要があります。
https://azure.microsoft.com/ja-jp/pricing/purchase-options/azure-account?icid=databricks
クレジットカード番号を入力する必要がありますが、利用者の許可なく従量課金されることはないとのことなので、許可しない限り無料で使用できると思います。
無料アカウントの作成が完了したら、画像の "作成" ボタンからワークスぺースを作成します。

価格レベルを "試用版" に設定さえすれば、ワークスペース名等はてきとうでよい気がします。(あくまでPythonコードを動かしてみることが目的なので。)

ネットワーク、暗号化設定も細かくできるようですが、今回はデフォルトの設定のままでよいです。"確認および作成" を押下し、3~4分待つとワークスペースが作成されます。
作成が完了したら、"ワークスペースの起動" ⇨ "+新規" からノートブックボタンを押下すると、コードが記載できる場所に移動できます。


2. Pythonコードを書いてみる。Azure Databricksの魅力。

今回は用意されているサンプルデータを使って、Apache Spark(PySpark)でデータをいじってみます。サンプルデータは "sales_customers" を使用しました。

df = spark.table("samples.bakehouse.sales_customers")
df.printSchema()
df.show(5)

上記のコードでデータを取り込み、データ構造の把握をします。データ取り込み時には、スキーマ名まで明記して取り込みます。

Azure Databricksでは実行したコードに間違いがあると、自動でコードの診断が始まり改善案を提案してくれます。

また "診断エラー" ボタンを押下すると、アシスタント(Copilot的なもの)がコードの解説をしてくれます。私はこの点がAWSなどと比べてかなり魅力に思えました。


3. 引き続きコードを書いていく。

データセットに欠損値がどの程度あるか見てみます。

PySparkではPandasのようにnull値が格納されている行を抽出する処理を書くのがめんどう(カラム名をいちいち明示する必要がある。あるいはループ処理でなんとかする。)なので、今回のように小規模データであるならばPandasに変換して欠損を確認する方法が楽です。
PySparkデータフレームから一時テーブルを作成してSQLで処理をする方法もありますが、どっちみち処理をたくさん書く必要が出てきそうだと思いました。


データ量を確認し、Pandasのデータフレームに変換をします。

df.count()   #300行だった。
pdf = df.toPandas()
pdf.isnull().sum()


null値がないことを確認できました。
後々機械学習を実装したいので、目的変数とするであろう "country" カラムの値をラベルエンコーディング(カテゴリ変数を数値へ変換)してみます。

pdf["country"].unique()
pdf["country"] = pdf["country"].astype("category")
pdf["country_code"] = pdf["country"].cat.codes

※PandasのデータフレームをPysparkのデータフレームへ変換して、StringIndexerでエンコーディングを実施しようとしたところ、"Py4Jセキュリティ制御によるエラー" が出ました。解決できず今回は諦めてPandasで処理しました。


ついでに "postal_zip_code" が数値型扱いになっているので、文字列型に変換します。(こちらは郵便番号なので文字列型が適当。)

df_pandas["postal_zip_code"] = df_pandas["postal_zip_code"].astype("object")

※後に実行するPySparkのcreateDataFrame()は、型推論を行いPandasのデータフレームへ変換するため、Pandas側で型を整理したもののPySparkへのデータフレーム変換時に型が変更されてしまうことがある。


PandasのデータフレームをPySparkのデータフレームに変換し直します。次の回で機械学習を実装したいので、必要となるカラムのみを選択してデータフレームへの変換を行います。

pdf_selected = pdf[["city", "state", "postal_zip_code", "country_code"]]
df_spark = spark.createDataFrame(pdf_selected)
df_spark.show(5)


最後に作成したデータフレームをテーブルとして保存します。私はワークスペース作成時にリソースグループ名(ワークスペース名)を "test" に設定していたので、カタログ内に自動で "test" というスキーマが作成されています。"test" の "default" スキーマにテーブルを出力させます。

df_spark.write.mode("overwrite").saveAsTable("test.default.my_table")



次回も引き続き、機械学習を実装するための前処理を行っていきます!