◾️はじめに
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】制御文字を扱うためのコマンド