❄️

Streamlit in Snowflakeのちょっとここがイケていない

2024/05/25に公開

この記事の対象ユーザー

  • Snowflakeユーザー
  • Streamlit in Snowflakeをこれから触ろうとしている人
  • Streamlit in Snowflakeを業務で使っていきたいと検討している人

背景

「Streamlit in Snowflake使えば、巨大なデータの可視化をローコスト&高速にできるのでは?」
Streamlit in Snowflakeが2023年12月に一般提供されたときに、真っ先に自身がよく分析するデータの可視化をStreamlit in Snowflake(以下「SiS」)でやってみようと考えました。

しかし、実際に検討を進める中でいくつか課題を感じたため、現在SiSは限定的なシーンのみで利用しています。

本記事では、私が課題に感じたことを共有するとともに、今後のSiSのアップデートへの期待を述べます。

参考

まず、以下の2つの記事に目を通すことをお勧めします。
SiSの基本的な操作と、業務利用の観点でSiSが優れている点がよくまとまっています。
是非参考にして欲しい。

前提

下記のシチュエーションを前提に、以降のダッシュボード作成並びに個人的な考察を述べます。

  • 2024年5月現在の情報を元に見解を述べています
  • ダッシュボードを閲覧するのは、高度なデータ分析技術を持たない一般ユーザー
  • これまではTableauやPowerBIといったBIツールを使用してダッシュボードを閲覧してきた
  • 今回、レセプトデータと呼ばれる保険診療における医療行為の報酬明細データをダッシュボードにまとめることにした
  • テーブルサイズ70GB、行数が50億程度のテーブルを複数組み合わせてダッシュボードを作成

作成したダッシュボード

イケていないと感じた点

1. 課金体系

Streamlitアプリが立ち上がっている間はウェアハウスが立ち上がったままになるので、どんどんクレジットが消費されます。

デフォルトだと15分経つと自動的に落ちます。
個人的に私が取り扱うデータは比較的大きいものが多いため、ウェアハウスはMやLサイズをよく使用します。
よって、可視化されたグラフとにらめっこして考え込んでいる時間も高価なウェアハウスの課金体系が適用されてしまいます。

2. Snowpark DataFrameのキャッシュ化ができない

Streamlitで可視化アプリを作ったことがある人なら下記のような処理を実装した経験が一度はあると思います。

@st.cache_data
def load_data(file):
    df = pd.read_csv(file)
    return df

df = load_data('XXXX')

Streamlitでは、アプリの中でインタラクションが発生するたびに、スクリプト全体が上から下まで再実行されます。
スクリプトに大規模なデータセットをロードする関数や時間のかかる計算を行う関数が含まれている場合、スクリプトが再実行されるたびにその関数を実行したくありません。
そのため、Streamlitのキャッシュを使用し、特定の関数が入力が変更された場合にのみ再実行されるようにしたいところです。
しかし、残念ながら2024年5月末現在、以下のようなSnowpark DataFrameを返り値とすることはできないようです。

# UnevaluatedDataFrameErrorになる
from snowflake.snowpark.contet import get_active_session

session = get_active_session()

@st.cache_data
def load_data(table):
    df = session.table(table)
    return df

df = load_data('XXXX')

もちろん、return df.to_pandas()すればよいのですが、この後に続く大規模データの前処理もできる限りSnowpark for Pythonでやりたい(というよりpandasでは処理できない)ので、個人的には結構気にしている制約事項となります。

3. エラーの原因がわかりづらい

これはユーザー目線ではなく、開発者目線ですが、Snowpark for Pythonでエラーが発生したときにどこに原因があるのか調査するのが非常に大変です。
こちらに関しては完全に個人の意見なので具体例は避けますが、多分共感してくれる人はそれなりにいると思っています。
(「Traceback:」を読んでもどこを修正すればよいのかわかりにくい)

4. ダッシュボードの共有方法が限定的

ダッシュボードの共有先は以下の2パターンに分かれます。
1.リンクを知っている「View only」または「owner」ロール
2.明示的に指定したロール

ダッシュボードを見るユーザーが、snowflakeユーザーに限られていれば問題にはなりませんが、それなりの規模の会社となると、「snowflakeユーザー⊆ダッシュボードを見るユーザ」となると思います。
よって、snowflakeユーザーにしか共有できないのは、ダッシュボードを活用するユーザー層にマッチしていないように感じています。
この点から、SiSを全社標準のダッシュボードに採用するのは流石に難しいと思っています。
※前提に記載した通り、今回は「一般ユーザー向けのダッシュボード」開発という観点でコメントしています。snowflakeユーザー間で共有するダッシュボードという観点では、SiSは非常に良いサービスだと思っています。

Streamlit in Snowflakeへの期待

1. 計算と閲覧時のウェアハウスを分離させる

巨大なデータの処理はMやLサイズのウェアハウスで実行し、処理完了後は自動的にXSサイズのウェアハウスに切り替わってくれたら嬉しい。

2. 書き換えていない部分はキャッシュ化してほしい

特にデータの読み込み部分。

3. エラーコードをChatGPTに貼り付けたら原因がわかるようにしてほしい

Snowflake Copilotでも可。最近便利なものに慣れ過ぎたせいか、ソースコードまで遡って原因探索するのはできれば回避したい。

4. 条件付きでリンク先の人ならだれでも閲覧可能な仕組みがほしい

さすがに本当の意味でリンクを知っていれば全員見れてしまうのはガバナンス上問題が発生するので、何か条件を満たしているユーザーを対象とした現在よりもう少し広い公開範囲設定を手軽にできると嬉しい。

最後に

この記事を書いた理由は、「ユーザーが声を上げることこそ、より製品の改善につながるから」という考えによるところが大きいです。
特に、Snowflake社は驚くべきスピードで新機能を出しているし、既存サービスのアップデートも正直ユーザーがついていくのが大変なスピードで行われています。
この記事をもし関係者が見かけたら「こうすればお悩み解決できますよ!」というアドバイスを頂けると非常に嬉しいし、もし現在解決策がなくてもこういう悩みを持ったユーザーがいることを是非開発チームに伝えていただけると幸いです。

Discussion