はじめに
近頃Pandasに代わり、Polarsが来ているそうです。
GlueではCSVやExcelなどをPandasでよく処理するので、Polarsが動くのか試してみました。
特にJuptyterNotebookのGlueを使って開発しているので、インタラクティブセッションでもジョブ実行でも使えるかを見てみました。
やったこと
コードはすべて、インタラクティブセッションで記述していきます。
デフォルトでインストールされていないことを確認
!pip3 list
で確認できます。Pandasはありますが、Polarsはありません。
モジュール追加
一番最初にPolarsを読み込ませます。
# 読み込ますモジュール
%additional_python_modules polars
インタラクティブセッション用に一度セッションを閉じます。(ジョブ実行時にこのコードがあっても問題ありません。)
%stop_session
そのあとに、最初からあるセルを持ってきています
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
サンプル実行
10行の例
以下の記事の「10行で把握するPolars」を実行してみます。
インタラクティブセッションにて
問題なく動いているようです。
Run Jobから
コードは何も修正せず、Run Jobで動かしました。ログはClooudWatchに書き出されます。
同じ結果が出てきていますので、動いていることがわかります。
100本ノックから
もう少し色々動かしてみたかったので、以下の記事の1-10本目を動かしてみます。
Glueでは、データのダウンロードの方法を別にしました。どうやらOSの領域とPythonの領域が異なるようで、コマンドで/tmpに落としても、Pythonの認識する/tmpには存在しませんでした。
# 以下の方法では、Pythonからは見れない
!git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
かわりにデータの読み込みを少し変更して、以下のようにread_csv
で直接サーバのファイルを指定しました。
# データの読み込み
import os
import polars as pl
dtypes = {
'customer_id': str,
'gender_cd': str,
'postal_cd': str,
'application_store_cd': str,
'status_cd': str,
'category_major_cd': str,
'category_medium_cd': str,
'category_small_cd': str,
'product_cd': str,
'store_cd': str,
'prefecture_cd': str,
'tel_no': str,
'postal_cd': str,
'street': str,
'application_date': str,
'birth_day': pl.Date
}
pathRoot = "https://raw.githubusercontent.com/The-Japan-DataScientist-Society/100knocks-preprocess/master/docker/work/"
df_customer = pl.read_csv(pathRoot + "data/customer.csv", dtypes=dtypes)
df_category = pl.read_csv(pathRoot + "data/category.csv", dtypes=dtypes)
df_product = pl.read_csv(pathRoot + "data/product.csv", dtypes=dtypes)
df_receipt = pl.read_csv(pathRoot + "data/receipt.csv", dtypes=dtypes)
df_store = pl.read_csv(pathRoot + "data/store.csv", dtypes=dtypes)
df_geocode = pl.read_csv(pathRoot + "data/geocode.csv", dtypes=dtypes)
変数に格納し、それぞれのインタラクティブセッションの結果とRun Jobでの結果を実行してみました。
P001
インタラクティブセッション
Run Job
P002
インタラクティブセッション
Run Job
P003
インタラクティブセッション
Run Job
P004
インタラクティブセッション
Run Job
P005
インタラクティブセッション
Run Job
P006
インタラクティブセッション
Run Job
P007
インタラクティブセッション
Run Job
P008
インタラクティブセッション
Run Job
P009
インタラクティブセッション
Run Job
P010
インタラクティブセッション
Run Job
いずれの例でも、どちらの実行方法もエラー無く出力されました。
おわりに
Glue(JupyterNotebook)でもPolarsは使えそうなので、今後は使っていきたいと感じました。
ですがGlueの起動時間が長いので、処理する内容が軽量の場合はPandasでもPolarsでもそんなに差はないかなと思います。小さなファイルをたくさん処理する場合は使い慣れた方を用いた方がいいかもしれません。