Glue(JupyterNotebook)でもPolarsは使えそう

# はじめに

近頃Pandasに代わり、Polarsが来ているそうです。

https://qiita.com/_jinta/items/fac13f09e8e8a5769b79

GlueではCSVやExcelなどをPandasでよく処理するので、Polarsが動くのか試してみました。
特にJuptyterNotebookのGlueを使って開発しているので、インタラクティブセッションでもジョブ実行でも使えるかを見てみました。


# やったこと
コードはすべて、インタラクティブセッションで記述していきます。

## デフォルトでインストールされていないことを確認
`!pip3 list`で確認できます。Pandasはありますが、Polarsはありません。

https://qiita.com/a_b_/items/3200dba0e76ce1c4b53a#%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

## モジュール追加

一番最初にPolarsを読み込ませます。
```python
# 読み込ますモジュール
%additional_python_modules polars
```

インタラクティブセッション用に一度セッションを閉じます。（ジョブ実行時にこのコードがあっても問題ありません。）
```python
%stop_session
```

そのあとに、最初からあるセルを持ってきています

```python:最初からあるセル(未修整)
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」を実行してみます。

https://qiita.com/_jinta/items/fac13f09e8e8a5769b79#10%E8%A1%8C%E3%81%A7%E6%8A%8A%E6%8F%A1%E3%81%99%E3%82%8Bpolars

### インタラクティブセッションにて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e719814d-c633-759a-5d2b-d3b9e4efe32d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6d8b9fd0-eb89-51ad-a5b5-f81b7d0555ce.png)

問題なく動いているようです。

### Run Jobから

コードは何も修正せず、Run Jobで動かしました。ログはClooudWatchに書き出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d62eba90-4a53-58c9-df18-c8c892f58da0.png)

同じ結果が出てきていますので、動いていることがわかります。

## 100本ノックから

もう少し色々動かしてみたかったので、以下の記事の1-10本目を動かしてみます。

https://qiita.com/_jinta/items/28442d25bba067c13bb7

Glueでは、データのダウンロードの方法を別にしました。どうやらOSの領域とPythonの領域が異なるようで、コマンドで/tmpに落としても、Pythonの認識する/tmpには存在しませんでした。
```
# 以下の方法では、Pythonからは見れない
!git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
```

かわりにデータの読み込みを少し変更して、以下のように`read_csv`で直接サーバのファイルを指定しました。
```python
# データの読み込み
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
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/25111b99-7276-a178-e62c-97dc2561476e.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/90a368bf-c128-3ee0-5169-12a29ef73917.png)


### P002
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/de873f5c-d636-9dff-1c00-e6f8ce9b11f1.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/31412028-7df1-9f7c-71a1-f1fbdf43490d.png)


### P003
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/bea8b543-6275-cab8-d83b-c2d2f16e86e4.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0960ddb7-64e0-645a-f37f-f7224cc47888.png)


### P004
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/55e94d59-e9df-cf6d-e895-e437be81836a.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/13f14b8f-9012-0cf7-e777-931dbbf5a8f3.png)

### P005
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7b95e130-a540-c8e3-5a0f-065127d8efd0.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e5a70728-ff1d-3579-62f4-275ed2223fd5.png)


### P006
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9e0652f2-51bc-e2b4-02d5-e24668c35d3e.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d64950de-2b54-bb91-5bb0-190ac077563f.png)

### P007
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/09f55247-36e6-c11a-97a4-ae30455fbc1f.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/eb46faea-96ed-dd1e-c0b6-ea281bf99c3f.png)

### P008
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7e50550d-889f-b5d6-5062-fcafb13733b4.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/516ae7f7-2bf0-4fc0-983c-ac4f0a201bd9.png)

### P009
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/50ee4604-f6df-63e2-4a18-7e21c1bef39c.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1027f351-cc45-ea75-aa31-65e94b856bbb.png)

### P010
#### インタラクティブセッション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4efa332c-ba6d-6444-1969-3d6953a1708e.png)

#### Run Job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ca58c2b0-e161-1d12-8336-28e27197c0ec.png)

いずれの例でも、どちらの実行方法もエラー無く出力されました。

# おわりに
Glue(JupyterNotebook)でもPolarsは使えそうなので、今後は使っていきたいと感じました。
ですがGlueの起動時間が長いので、処理する内容が軽量の場合はPandasでもPolarsでもそんなに差はないかなと思います。小さなファイルをたくさん処理する場合は使い慣れた方を用いた方がいいかもしれません。