【Snowflake】【トラブル】エラー「Invalid UTF8 detected while decoding 'XXX'」表示

◾️はじめに

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
SnowflakePostgreSQL の違い
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