Snowflake

Snowpark for Pythonを触ってみてわかったこと-後編-

こんにちは、朝見ている方はおはようございます、yokochanです。

前回の続きになります。今回は具体的な関数の話などをガンガンしていこうと思います。

とはいえ今回はちょろっとDataFrameの周辺を触っただけなのでDataFrame中心になります。(MLも今後は触っていきたい……!)

前回の記事はこちら↓

Snowpark for Pythonを触ってみてわかったこと-前編-

Snowpark for Pythonを触ってみてわかったこと-前編-こんにちは、夜見ている方はこんばんは、yokochanです。 Snowflakeを使っていて、Snowparkというものがあること...

できたこと/やってみたこと

認証情報を使ってSnowflakeに接続

まずはSnowflakeに繋がないと何もできません。

今回はtomlファイルに認証情報を記述してそこから情報を引っ張るという方法でやりました。

import toml
from snowflake.snowpark import Session

# tomlファイルを開く
secrets = toml.load(open('secrets.toml'))

# 空の辞書を作成
con = {}

# 辞書に値を追加
con['user'] = secrets['snowflake']['user']
con['password'] = secrets['snowflake']['password']
con['account'] = secrets['snowflake']['account']
con['warehouse'] = secrets['snowflake']['warehouse']

# セッションの作成
session = Session.builder.configs(con).create() 

 

このとき作成したtomlファイルはこんな感じ

[snowflake]
user = "USERNAME"
password = "pass1234xxxx"
account = "xy99999.japan-east.azure"
warehouse = "WH_XS"

 

SQLの実行結果をSnowparkのDataFrameに格納(session.sql)

これをするだけであとはPandasのDataFrameとだいたい同じことができます。(まったく同じではないことが重要)

df = session.sql('select * from \"DatabaseName\".\"SchemaName\".\"TableName\"')

※テーブル名などに小文字が入る場合は” “を付けないと大文字に変換されてエラーになるので注意

SnowparkのDataFrameをPandasのDataFrameに変換(to_pandas)

結局Pandasに変換したいという場面もある。

pandas_df = snowpark_df.to_pandas()

 

PandasのDataFrameをSnowparkのDataFrameに変換してSnowflakeテーブルに保存(session.write_pandas)

snowpark_df = session.write_pandas(pandas_df, "SnowflakeTBL", auto_create_table=True)

 

カラム名の変更

from snowflake.snowpark.functions import col
snowpark_df = snowpark_df.rename(col("DATETIME"),"NEW_DATETIME")

 

空のテーブルを作成

絶対にもっといい書き方ありそうなのだが……

from snowflake.snowpark.types import StructType, StructField, StringType, TimestampType

row = StructType([StructField("ID", StringType()), StructField("DATETIME", TimestampType())])
snowpark_df = session.create_dataframe([[None, None]],row)
snowpark_df = snowpark_df.dropna()

 

できなかったこと

意外と横結合ができないらしい。

以下の書き方だとCROSS JOINになるみたい

df = df1.join(df2)

工夫すればできそうな気がするんですが、思う通りに動かなかったです(わかる人いたら教えてほしい……)

カラムをリストの扱いができない

以下の書き方だとリストの扱いにならない

list = snowpark_df["col_1"]

あるカラムの値を1つずつ取り出してループ処理させようとしたときにこれができなくて困りました……(結局pandasに変換してやってしまった)

触ってみた感想

ほんとーに表面上しか触っていないですが、感想としては「けっこう癖がある」です。

覚えておいた方がいいこととしてはあくまでも「SQLのクエリに変換してSnowflakeテーブルを扱っている」です。

Snowflakeのテーブルを扱っている以上、列指向なテーブルであり、インデックスを取ったりリストの順番を考慮した処理を行うことはできないということを頭に入れておいた方が良いでしょう。

慣れていけばできないと思っていたこともできるようになりそうな気配はしますが、単純にPythonができる人間がすぐに使いこなせるかと言われると少し時間はかかりそうです。

また、Snowparkは常にアップデートし続けており、MLやアプリケーションについても機能がどんどん追加されている状況なので今後使いやすくなるのは間違いないと思います。

今後のSnowflakeの発展に期待です!

参考にした記事

yokochan
データ基盤構築やデータ可視化をやっています。 夏は沖縄の海、冬は北海道の山、年がら年中ももクロのライブ会場。