【Snowflake】Snowflake ~ 特殊文字で区切ったファイルを表示するには ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2022/09/01/220643
https://dk521123.hatenablog.com/entry/2023/07/27/000000

の続き。
小ネタ。

https://dk521123.hatenablog.com/entry/2024/12/03/003405

で、業務で制御文字SOH(確かHiveのデフォルト区切り文字?)で
区切られたファイルをSnowflakeでロードすることになったのだが
調べたのが中途半端だったので、今回でちゃんとメモっておく

目次

【1】Snowflakeで特殊文字で区切ったファイルを表示するには
 1)公式ドキュメント
 2)使用上の注意
【2】サンプル
 例1:特殊文字SOHが区切り文字のファイルを表示する

【1】Snowflake特殊文字で区切ったファイルをロードするには

* FIELD_DELIMITER = '0xXX' を指定すればOK

1)公式ドキュメント

https://docs.snowflake.com/ja/sql-reference/sql/create-stage#type-csv

FIELD_DELIMITER = 'string' | NONE

使用

データのロード、データのアンロード、および外部テーブル

定義

入力ファイル(データのロード)またはアンロードされたファイル(データのアンロード)
のフィールドを区切る1つ以上のシングルバイトまたはマルチバイト文字。
一般的なエスケープシーケンス、または次のシングルバイト
またはマルチバイト文字を受け入れます。

シングルバイト文字
8進値(\\ でプレフィックス)、または16進値(0x または \x でプレフィックス)
を受け入れます。
たとえば、アクサンシルコンフレックス(^)文字で区切られた記録の場合は、
8進数(\\136)または16進数(0x5e)の値を指定します。

デフォルト
コンマ(,)

2)使用上の注意

* 別項目で「RECORD_DELIMITER」ってのもあるから注意
 => こっちは、行の区切り文字(デフォルトは改行文字)

https://docs.snowflake.com/ja/sql-reference/sql/create-stage#type-csv

より抜粋
~~~~
RECORD_DELIMITER = 'string' | NONE

入力ファイル(データのロード)またはアンロードされたファイル(データのアンロード)
の記録を分離する、1つ以上のシングルバイトまたはマルチバイト文字。
一般的なエスケープシーケンス、または次のシングルバイト
またはマルチバイト文字を受け入れます。

デフォルト
データのロード
改行文字。「改行」は論理的であるため、
 \r\n がWindowsプラットフォーム上のファイルの改行
として理解されることに注意してください。

データのアンロード
改行文字(\n)。
~~~~

RECORD_DELIMITER と間違った場合、、、

-- 自分だけかもしれないが、個人的にこれで大分ハマった、、、

/*
001[SOH]Mike[SOH]23
002[SOH]Tom[SOH]34
003[SOH]Kevin[SOH]65
...
を読み取った場合
*/
SELECT
  ts.$1 AS user_id,
  ts.$2 AS user_name,
  ts.$3 AS user_age
FROM
  @test_stage AS ts;


-- 第一引数だけに表示され、改行部分は飛ばされ
-- 一部は「23 002」みたいに混じって表示される

出力例

user_id user_name user_age
001 null null
Mike null null
23 002 null null
Tom null null
34 003 null null
Kevin null null
65 ... null null

【2】サンプル

例1:特殊文字SOHが区切り文字のファイルを表示する

-- 前提条件:STORAGE_INTEGRATIONは作成済みとする
USE DATABASE test_db;
USE SCHEMA test_schema;

-- ヘッダーなしのCSVで区切り文字がSOHの場合
CREATE OR REPLACE TEMPORARY STAGE test_stage
  URL = 's3://your-s3-bucket-name/'
  FILE_FORMAT = (TYPE = CSV, FIELD_DELIMITER = '0x01', PARSE_HEADER = FALSE) -- ★注目★
  STORAGE_INTEGRATION = demo_integration
;

-- 表示する
SELECT
  ts.$1 AS user_id,
  ts.$2 AS user_name,
  ts.$3 AS user_age
FROM
  @test_stage AS ts;

関連記事

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/09/01/220643
Snowflake ~ ストレージ統合の作成手順 ~
https://dk521123.hatenablog.com/entry/2023/07/27/000000
Linux】制御文字を扱うためのコマンド