6
5

Snowflake Pythonワークシートの出力(Output)に日本語を表示させる

Last updated at Posted at 2023-10-29

結論

以下をハンドラーの前に追記すると良い。

import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

結果

image.png

Pythonワークシートは便利

Snowflake上でPythonを書いて実行できるのは便利。

とりあえず何らかのPythonでコードを書いて試してみよう...みたいなお手軽実行環境としても、アドホック対応でPythonコードを書いて実行して何かしらデータを更新する、みたいに使える。

FaaSっぽく使える?は言い過ぎかもしれないが。
クラウド上でエディタを開いてPython書いてクラウド上のコンピュートリソースを使って実行できて、実際にデータベース(リソース)に反映することができる、そういった動きからすると使用感としては近しい何かはあるのかな。

また、ここでコードが動くことを確認できていれば後でストアドプロシージャ(Python)に移植するのも楽になる。

とはいえまだプレビュー機能の模様。

日本語が使えなさそう?

デバッグプリント目的で日本語を表示させようとすると、なんかエラーが出るぞ...

Pythonワークシートに以下のようなコードを書いてみる。

import snowflake.snowpark as snowpark


def main(session: snowpark.Session): 
    print("日本語の表示テスト")

このコードではreturnしないので、Settings -> Return type を String にしておく。

また、Pythonワークシートを実行するときの最低限のお作法?としてはUSAGE権限があるデータベース、スキーマを選択しておくことも忘れずに。(SnowflakeデータベースのようなシェアオブジェクトもNG)

選択していない状態でコードを実行した後、Outputタブを開くと以下のように表示されているので、日本語表示確認どころではない。

Log output not captured. Ensure you have selected a database and schema on which your role has USAGE privileges, and that the selected database is not from a share, then run the worksheet again.

では改めて。
先ほど書いたコード実行すると、Resultsタブの方に...

100357 (P0000): Python Interpreter Error:

Traceback (most recent call last):
  Worksheet, line 4, in main
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)

とのこと。
日本語が入っているとこうなる。

これは、Snowparkのdataframeに日本語が入っているときに、dataframe.show()のように表示しようとしても同様のエラーに引っかかる。
日本語が入っているデータを扱う際には何かと引っかかってストレスになりそうな予感。

なら対策すればいい

とりあえず出力時の文字コードに関する問題っぽいので、対処してみる。

import snowflake.snowpark as snowpark
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')


def main(session: snowpark.Session): 
    print("日本語の表示テスト")

これを実行すると...

image.png

Resultタブの方は何も出ない。 これはreturnしていないから。
エラーはないので、うまくいったということ。

Outputタブを開いてみると...

image.png

うまく表示できた。

標準エラー出力等も考慮してみると、以下の記述にしておいた方がいいかも。

import snowflake.snowpark as snowpark
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')


def main(session: snowpark.Session): 
    print("日本語の表示テスト")

とりあえず、現時点でSnowflakeのWebUI(Snowsight)でPythonワークシートで日本語をデバッグ出力したいならこの設定を入れておこう、といった感じで良さそうかな。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5