- カテゴリ:
INFER_SCHEMA¶
半構造化データを含む一連のステージングデータファイル内のファイルメタデータスキーマを自動的に検出し、列定義を取得します。
GENERATE_COLUMN_DESCRIPTION 関数は、 INFER_SCHEMA 関数の出力に基づいて構築され、ステージングされたファイルの列定義に基づいて、新しいテーブル、外部テーブル、またはビュー(適切な CREATE <オブジェクト> コマンドを使用)の作成を簡素化します。
CREATE TABLE、 CREATE EXTERNAL TABLE、または CREATE ICEBERG TABLE コマンドを USING TEMPLATE 句とともに実行すると、 INFER_SCHEMA 関数の出力から派生した列定義で新しいテーブルまたは外部テーブルを作成できます。
注釈
この関数は、Apache Parquet、Apache Avro、 ORC、 JSON、 CSVのファイルをサポートします。
構文¶
条件:
引数¶
LOCATION => '...'ファイルが保存される内部ステージまたは外部ステージの名前。必要に応じて、クラウドストレージの場所にある1つ以上のファイルへのパスを含めます。それ以外の場合、 INFER_SCHEMA 関数は、ステージにあるすべてのサブディレクトリ内のファイルをスキャンします。
@[namespace.]int_stage_name[/path][/filename]ファイルは指定された名前付き内部ステージにあります。
@[namespace.]ext_stage_name[/path][/filename]ファイルは指定された名前付き外部ステージにあります。
@~[/path][/filename]ファイルは現在のユーザーのステージにあります。
注釈
この SQL 関数は、名前付きステージ(内部または外部)とユーザーステージのみをサポートします。テーブルステージには対応していません。
FILES => ( 'file_name' [ , 'file_name' ] [ , ... ] )半構造化データを含むステージングされたファイルのセット内にある1つ以上のファイル(コンマで区切られた)のリストを指定します。 ファイルは、コマンドで指定されたSnowflake内部の場所または外部の場所のいずれかに既にステージングされている必要があります。指定されたファイルのいずれかが見つからない場合、クエリは中止されます。
指定できるファイル名の最大数は1000です。
注釈
外部ステージのみ(つまり、Amazon S3、Google Cloud Storage、またはMicrosoft Azure)、ステージ定義の URL と解決されたファイル名のリストを連結することにより、ファイルパスが設定されます。
ただし、Snowflakeはパス名とファイル名の間に暗黙的に区切り文字を挿入しません。ステージ定義の URL の末尾、またはこのパラメーターで指定された各ファイル名の先頭のいずれかに明示的に区切り文字(
/)を含める必要があります。FILE_FORMAT => 'file_format_name'ステージングされたファイルに含まれるデータを説明するファイル形式オブジェクトの名前。詳細については、 CREATE FILE FORMAT をご参照ください。
IGNORE_CASE => TRUE | FALSEステージファイルから検出された列名を大文字と小文字を区別して扱うかどうかを指定します。デフォルトでは、値は FALSE です。これは、Snowflakeが列名を取得するときにアルファベットの大文字と小文字を保持することを意味します。値を TRUE として指定すると、列名で大文字と小文字は区別されず、すべての列名は大文字として取得されます。
MAX_FILE_COUNT => numステージからスキャンされるファイルの最大数を指定します。このオプションは、ファイル間で同一のスキーマを持つ大量のファイルに推奨します。このオプションでは、どのファイルをスキャンするかを決定できません。特定のファイルをスキャンしたい場合は、代わりに
FILESオプションを使用します。MAX_RECORDS_PER_FILE => numファイルごとにスキャンされる記録の最大数を指定します。このオプションは CSV と JSON ファイルにのみ適用されます。大きなファイルにはこのオプションを使うことを推奨します。このオプションは、スキーマ検出の精度に影響する可能性があります。
KIND => 'kind_name'ステージングされたファイルのメタデータスキーマを指定します。デフォルト値は
STANDARDで、ステージからスキャンできるファイルメタデータスキーマはSnowflakeテーブル用で、出力はSnowflakeデータ型であることを意味します。値をICEBERGと指定すると、スキーマはApache Icebergテーブル用になり、出力はIcebergデータ型になります。注釈
Parquetファイルを推論してIcebergテーブルを作成する場合は、
KIND => 'ICEBERG'を設定することを強くお勧めします。そうでない場合、関数が返す列定義が正しくない可能性があります。
出力¶
この関数は、次の列を返します。
列名 |
データ型 |
説明 |
|---|---|---|
COLUMN_NAME |
TEXT |
ステージングされたファイルの列の名前。 |
TYPE |
TEXT |
列のデータ型。 |
NULLABLE |
BOOLEAN |
列の行が、値の代わりに NULL を保存できるかどうかを指定します。現在、列の推定NULL可能性は、スキャンされたセット内の1つのデータファイルに適用できますが、他のファイルには適用できません。 |
EXPRESSION |
TEXT |
|
FILENAMES |
TEXT |
列を含むファイルの名前。 |
ORDER_ID |
NUMBER |
ステージングされたファイルの列の順序。 |
使用上の注意¶
CSV ファイルの場合、ファイル形式オプション
PARSE_HEADER = [ TRUE | FALSE ]を使って列名を定義することができます。オプションが TRUE に設定されている場合は、最初の行のヘッダーが列名を決定するために使われます。
デフォルト値 FALSE は、列名をc*として返します。*は列の位置です。SKIP_HEADER オプションは PARSE_HEADER = TRUE ではサポートされていません。
PARSE_HEADER オプションは外部テーブルではサポートされていません。
CSV および JSON の両ファイルで、 DATE_FORMAT、 TIME_FORMAT、および TIMESTAMP_FORMAT のファイル形式オプションは現在サポートされていません。
JSON TRIM_SPACE ファイル形式オプションはサポートされていません。
JSON ファイルに含まれる科学的な注釈(例:1E2)は、 REAL データ型として取得されます。
タイムスタンプデータ型のすべてのバリエーションは、タイムゾーン情報を含まない TIMESTAMP_NTZ として取得されます。
CSV と JSON の両ファイルで、すべての列は NULLABLE として識別されます。
KIND => 'STANDARD'とKIND => 'ICEBERG'の両方で、ステージで指定されたファイルにネストされたデータ型が含まれている場合、ネストの最初のレベルのみがサポートされ、それ以上のレベルはサポートされません。Apache Iceberg™ バージョン3(v3)テーブルはサポートされていません。
例¶
Snowflake列定義¶
mystage ステージにあるParquetファイルのSnowflake列定義を取得します。
前の例と似ていますが、 mystage ステージで単一のParquetファイルを指定します。
IGNORE_CASE に TRUE を指定した mystage ステージにあるParquetファイルのSnowflake列定義を取得します。返される出力では、すべての列名が大文字として取得されます。
mystage ステージの JSON ファイルのSnowflake列定義を取得します。
ステージングされた JSON ファイルから検出されたスキーマを使用してテーブルを作成します。
注釈
ARRAY_AGG(OBJECT_CONSTRUCT()) に * を使用すると、返される結果が128 MB よりも大きい場合にエラーになる可能性があります。大きな結果セットの場合は * の使用を避け、クエリには必要な列(COLUMN NAME、TYPE、NULLABLE)のみを使用することをお勧めします。ORDER_ID を使用する場合は、オプションの列 WITHIN GROUP (ORDER BY order_id) を含めることができます。
mystage ステージで CSV ファイルの列定義を取得し、 MATCH_BY_COLUMN_NAME を使用して CSV ファイルをロードします。
Iceberg列定義¶
mystage ステージでParquetファイルのIceberg列定義を取得します。
出力:
ステージングされたParquetファイルから検出しスキーマを使用して、Apache Iceberg™ テーブルを作成します。
注釈
ARRAY_AGG(OBJECT_CONSTRUCT()) に * を使用すると、返される結果が128 MB よりも大きい場合にエラーになる可能性があります。より大きな結果セットに対する * の使用は避けることをお勧めします。また、クエリには必要な列、COLUMN NAME、TYPE および NULLABLE のみを使用してください。ORDER_ID を使用する場合は、オプションの列 WITHIN GROUP (ORDER BY order_id) を含めることができます。