Transform data during a load¶
Snowflakeは、 COPY INTO <テーブル> コマンドを使用してデータをテーブルにロードする際のデータの変換をサポートし、基本的な変換のための ETL パイプラインを劇的に簡素化します。この機能により、データのロード中に列を並べ替える際に、一時テーブルを使用して事前に変換されたデータを保存する必要がなくなります。この機能は、一括ロードとSnowpipeの両方に適用されます。
COPY コマンドは以下をサポートします。
SELECT ステートメントを使用した列の並べ替え、列の省略、およびキャスト。データファイルに、ターゲットテーブルと同じ数と列の順序を持たせる必要はありません。
ENFORCE_LENGTH | TRUNCATECOLUMNS オプションは、ターゲット列の長さを超えるテキスト文字列を切り捨てることができます。
ステージングされたデータファイルのクエリに関する一般情報については、 Query data in staged files をご参照ください。
使用上の注意¶
このセクションでは、ロード中にステージングされたデータファイルを変換するための使用情報を提供します。
サポートされているファイル形式¶
次のファイル形式タイプは、 COPY 変換でサポートされています。
CSV
JSON
Avro
ORC
Parquet
XML
ステージングされたデータファイルを解析するには、そのファイル形式を記述する必要があります。
- CSV:
デフォルトの形式は、文字区切りの UTF -8テキストです。デフォルトのフィールド区切り文字はコンマ文字(
,)です。デフォルトのレコード区切り文字は改行文字です。ソースデータが別の形式の場合は、ファイル形式のタイプとオプションを指定します。ステージングされたデータファイルをクエリする場合、
ERROR_ON_COLUMN_COUNT_MISMATCHオプションは無視されます。データファイルは、ターゲットテーブルと同数および同順序の列である必要はありません。- 他のすべてのファイル形式タイプ:
データファイルに一致する形式タイプとオプションを指定します。
ファイル形式のオプションを明示的に指定するには、次のいずれかの方法で設定します。
SELECT ステートメントを使用したステージングデータファイルのクエリ: |
|
COPY INTO <テーブル> ステートメント: を使用した、ステージングされたデータファイルからの列のロード |
|
サポートされている関数¶
Snowflakeは現在、 COPY 変換用に次の関数サブセットをサポートしています。
-
この関数を使用して値を明示的にキャストする場合は、 DATE_FORMAT ファイル形式オプションも DATE_INPUT_FORMAT パラメーターも適用されないことに注意してください。
-
この関数を使用して値を明示的にキャストする場合は、 TIME_FORMAT ファイル形式オプションも TIME_INPUT_FORMAT パラメーターも適用されないことに注意してください。
-
この関数を使用して値を明示的にキャストする場合は、 TIMESTAMP_FORMAT ファイル形式オプションも TIMESTAMP_INPUT_FORMAT パラメーターも適用されないことに注意してください。
-
COPY INTO <テーブル> コマンドは、この関数のオプションである
format引数をサポートしていないことに注意してください。 -
COPY INTO <テーブル> コマンドは、この関数のオプションである
format引数をサポートしていないことに注意してください。
特に、 VALIDATE 関数は COPY INTO <テーブル> ステートメントの SELECT リストを無視することに注意してください。この関数は、ステートメントで参照されているファイルを解析し、解析エラーを返します。関数が COPY INTO <テーブル> 式のコンテキストでファイルを評価することを期待している場合、この動作は驚くべきものになる可能性があります。
COPY 変換は、 FLATTEN 関数、または JOIN、 または GROUP BY (集計)構文をサポート しません。
サポートされる関数のリストは、時間の経過とともに拡大する可能性があります。
次のカテゴリの関数もサポートされています。
Scalar SQLUDFs。
注釈
Scalar SQL UDFs の場合、Snowflakeでは変換エラー処理のサポートが限られており、一貫性のない、または予期しない ON_ERROR コピーオプションの動作に遭遇する可能性があります。
Filter results¶
WHERE 句を使用した FROM 句の結果のフィルタリングはサポートされていません。SELECT ステートメントの ORDER BY、 LIMIT、 FETCH、 TOP キーワードもサポートされていません。
SELECT ステートメントの DISTINCT キーワードは完全にはサポートされていません。キーワードを指定すると、一貫性のない、または予期しない ON_ERROR コピーオプションの動作が発生する可能性があります。
VALIDATION_MODE パラメーター¶
VALIDATION_MODE パラメーターは、ロード中にデータを変換する COPY ステートメントをサポートしません。
CURRENT_TIME、 CURRENT_TIMESTAMP デフォルトの列値¶
ロード時間をキャプチャするために CURRENT_TIME、CURRENT_TIMESTAMP のデフォルトの列値を使用する代わりに、 METADATA$START_SCAN_TIME をクエリして記録の正確なロード時間値を取得することをお勧めします。詳細については、 Query metadata for staged files をご参照ください。
MATCH_BY_COLUMN_NAME copy option¶
ロード中のデータ変換に MATCH_BY_COLUMN_NAME コピーオプションと SELECT ステートメントを合わせて使用することは、すべての場合において許可されていません。この2つのオプションを個別に使用することはできますが、併用することはできません。これを実行しようとすると、エラー、 SQL compilation error: match_by_column_name is not supported with copy transform が発生します.
Transform CSV data¶
テーブルデータのサブセットのロード¶
データのサブセットをテーブルにロードします。不足している列については、Snowflakeはデフォルト値を挿入します。次の例では、ステージングされた CSV ファイルの列1、2、6、および7からデータをロードします。
ロード中の CSV 列の並べ替え¶
次の例では、テーブルにロードする前に、ステージングされた CSV ファイルの列データを並べ替えます。さらに、 COPY ステートメントは SUBSTR , SUBSTRING 関数を使用して、文字列を挿入する前に最初の数文字を削除します。
ロード中のデータ型の変換¶
データのロード中にステージングされたデータを他のデータ型に変換します。すべての 変換関数 がサポートされています。
たとえば、それぞれ TO_BINARY、 TO_DECIMAL , TO_NUMBER , TO_NUMERIC、および TO_TIMESTAMP / TO_TIMESTAMP_* 関数を使用して、文字列をバイナリ値、10進数、またはタイムスタンプとして変換します。
サンプル CSV ファイル:
SQL ステートメント:
ロードされたデータへのシーケンス列の追加¶
CREATE SEQUENCE を使用してシーケンスオブジェクトを作成します。COPY コマンドを使用してデータをテーブルにロードする場合、 NEXTVAL 式を使用してオブジェクトにアクセスし、ターゲット番号列のデータをシーケンスします。クエリでのシーケンスの使用の詳細については、 シーケンスの使用 をご参照ください。
ロードされたデータへのAUTOINCREMENT / IDENTITY列の追加¶
数値列の AUTOINCREMENT または IDENTITY のデフォルト値を設定します。COPY コマンドを使用してテーブルにデータをロードする場合、 SELECT ステートメントの列を省略します。このステートメントは自動的にデータを列に取り込みます。
Transform semi-structured data¶
このセクションの例は、特に断りのない限り、半構造化データ型に適用されます。
半構造化データの個別の列へのロード¶
次の例では、ステージングされた半構造化ファイルから異なるデータ型の個別のテーブル列に、繰り返しの要素をロードします。
この例では、次の半構造化データをリレーショナルテーブルの個別の列にロードし、 location オブジェクト値を VARIANT 列にロードし、残りの値をリレーショナル列にロードします。
次の SQL ステートメントは、内部ステージ mystage からファイル sales.json をロードします。
注釈
この例では JSON データをロードしますが、他の型(例: Avro、 ORC)の半構造化データをロードする場合の SQL ステートメントも同様です。
Parquetデータを使用する追加の例については、 Parquetデータを個別の列にロードする (このトピック内)をご参照ください。
Parquetデータの個別列へのロード¶
前の例と同様ですが、Parquet形式のファイルから半構造化データをロードします。この例は、Apache Parquetに精通しているユーザー向けに提供されています。
半構造化データのフラット化¶
FLATTEN は、 VARIANT、 OBJECT、または ARRAY 列の側面ビューを生成するテーブル関数です。 半構造化データの個別の列へのロード のサンプルデータを使用して、オブジェクトの各要素に個別の行を持つテーブルを作成します。
半構造化要素の分割と VARIANT 値としての個別の列へのロード¶
半構造化データの個別の列へのロード の手順に従って、半構造化データの個々の要素をターゲットテーブルの異なる列にロードできます。さらに、 SPLIT 関数を使用して、セパレーターを含む要素値を分割し、それらを配列としてロードできます。
たとえば、繰り返し要素のドット区切りで IP アドレスを分割します。IP アドレスを個別の列の配列としてロードします。