◾️はじめに
Snowflakeでトラブルがあったのでメモ。 以下のサイトが非常にいい記事で助かった。
https://zenn.dev/indigo13love/articles/be2a44901cc0af
目次
【1】トラブル概要 1)エラーになるSQL例 2)エラーにならなかったSQL例 【2】エラー内容 【3】原因 1)前提知識 2)原因 【4】解決案 案1:REPLACE_INVALID_CHARACTERS = TRUE を使う 案2:ファイルから不正文字を除去する 【5】Tips 1)REPLACE_INVALID_CHARACTERS 2)HEX_ENCODE 3)HEX_DECODE_STRING 4)TRY_HEX_DECODE_STRING
【1】トラブル概要
Snowflakeで以下「1)エラーになるSQL例」を実行したら エラー「Invalid UTF8 detected while decoding 'XXX'」表示された
1)エラーになるSQL例
CREATE TEMPORARY STAGE IF NOT EXISTS test_stage URL = 's3://your-s3-bucket-name/demo/demo.parquet' FILE_FORMAT = (TYPE = PARQUET) STORAGE_INTEGRATION = demo_integration ; -- ★ここでエラー SELECT $1:user_id, $1:user_name FROM @test_stage LIMIT 100 ;
2)エラーにならなかったSQL例
SELECT COUNT(*) FROM @test_stage ;
【2】エラー内容
Invalid UTF8 detected while decoding 'XXX'
【3】原因
1)前提知識
* Snowflake 上でサポートされている文字コードは UTF-8
2)原因
* ファイルの項目に、UTF-8 以外の文字コードが含まれていたため
【4】解決案
案1:REPLACE_INVALID_CHARACTERS = TRUE を使う
* REPLACE_INVALID_CHARACTERS = TRUE を使い 無効な UTF -8文字をUnicode置換文字で置き換えるようにする
サンプル
CREATE TEMPORARY STAGE IF NOT EXISTS test_stage URL = 's3://your-s3-bucket-name/demo/demo.parquet' FILE_FORMAT = (TYPE = PARQUET, REPLACE_INVALID_CHARACTERS = TRUE) STORAGE_INTEGRATION = demo_integration ; SELECT $1:user_id, $1:user_name FROM @test_stage LIMIT 100 ;
案2:ファイルから不正文字を除去する
* ファイルから不正文字を除去してからファイルに取り込む
補足:原因の特定について
* どの項目に入っているかどうかを調べるために、 Snowflake・Pythonで読み込んで確認を試みたが、エラーになり確認できなかった * 今回は、Amazon S3 Selectを使って (Format:Apache Parquet, Output settings:JSON) データを表示して(SELECT * FROM s3object LIMIT 100)、該当項目を特定した。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/selecting-content-from-objects.html
【5】Tips
1)REPLACE_INVALID_CHARACTERS
* 無効な UTF -8文字をUnicode置換文字で置き換えるかどうか
https://docs.snowflake.com/ja/sql-reference/sql/create-file-format
REPLACE_INVALID_CHARACTERS = TRUE | FALSE 使用 データのロードのみ 定義 無効な UTF -8文字をUnicode置換文字(�)で 置き換えるかどうかを指定するブール値。 TRUE に設定すると、Snowflakeは無効な UTF -8文字を Unicode置換文字に置き換えます。 FALSE に設定すると、無効な UTF-8文字エンコードが 検出されたときにロード操作でエラーが生成されます。 デフォルト FALSE
2)HEX_ENCODE
* 入力文字列を16進数エンコードする
https://docs.snowflake.com/ja/sql-reference/functions/hex_encode
SELECT HEX_ENCODE('Snowflake'); -------------------------+ HEX_ENCODE('SNOWFLAKE') | -------------------------+ 536E6F77666C616B65 | -------------------------+
3)HEX_DECODE_STRING
* 16進数エンコードされた文字列を文字列にデコードする
https://docs.snowflake.com/ja/sql-reference/functions/hex_decode_string
SELECT HEX_DECODE_STRING('536E6F77666C616B65'); -----------------------------------------+ HEX_DECODE_STRING('536E6F77666C616B65') | -----------------------------------------+ Snowflake | -----------------------------------------+
4)TRY_HEX_DECODE_STRING
* HEX_DECODE_STRING + デコード中にエラーが発生した場合に NULL 値を返す
https://docs.snowflake.com/ja/sql-reference/functions/try_hex_decode_string
参考文献
https://zenn.dev/indigo13love/articles/be2a44901cc0af
関連記事
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world ~
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ ストレージ統合 ~
https://dk521123.hatenablog.com/entry/2022/06/29/221037
Snowflake ~ エラー時の解析方法 ~
https://dk521123.hatenablog.com/entry/2022/04/20/192334
【Snowflake】ストアド ~ 基本編 / ループ ~
https://dk521123.hatenablog.com/entry/2022/12/16/143349
Snowflake と PostgreSQL の違い
https://dk521123.hatenablog.com/entry/2024/09/28/212432
Python ~ Parquet ~
https://dk521123.hatenablog.com/entry/2021/11/13/095519
Pandas ~ Parquet ~
https://dk521123.hatenablog.com/entry/2024/09/06/004125
Python 〜 s3fsライブラリ 〜
https://dk521123.hatenablog.com/entry/2025/06/09/160542