INFER_SCHEMA
ファイルメタデータのスキーマを自動検出し、カラム定義を取得します。
infer_schema は現在、次のファイル形式をサポートしています。
- Parquet - スキーマ推論をネイティブにサポート
- CSV - 区切り文字のカスタマイズとヘッダー検出に対応
- NDJSON - 改行区切りの JSON ファイル
圧縮のサポート: すべての形式で、拡張子 .zip, .xz, .zst の圧縮ファイルもサポートされます。
構文
INFER_SCHEMA(
LOCATION => '{ internalStage | externalStage }'
[ PATTERN => '<regex_pattern>']
[ FILE_FORMAT => '<format_name>' ]
[ MAX_RECORDS_PRE_FILE => <number> ]
[ MAX_FILE_COUNT => <number> ]
)
パラメータ
例
Parquet ファイル
-- Create stage and export data
CREATE STAGE test_parquet;
COPY INTO @test_parquet FROM (SELECT number FROM numbers(10)) FILE_FORMAT = (TYPE = 'PARQUET');
-- Infer schema from parquet files using pattern
SELECT * FROM INFER_SCHEMA(
location => '@test_parquet',
pattern => '.*[.]parquet'
);
結果:
+-------------+-----------------+----------+----------+----------+
| column_name | type | nullable | filenames| order_id |
+-------------+-----------------+----------+----------+----------+
| number | BIGINT UNSIGNED | false | data_... | 0 |
+-------------+-----------------+----------+----------+----------+
CSV ファイル
-- Create stage and export CSV data
CREATE STAGE test_csv;
COPY INTO @test_csv FROM (SELECT number FROM numbers(10)) FILE_FORMAT = (TYPE = 'CSV');
-- Create a CSV file format
CREATE FILE FORMAT csv_format TYPE = 'CSV';
-- Infer schema using pattern and file format
SELECT * FROM INFER_SCHEMA(
location => '@test_csv',
pattern => '.*[.]csv',
file_format => 'csv_format'
);
結果:
+-------------+---------+----------+----------+----------+
| column_name | type | nullable | filenames| order_id |
+-------------+---------+----------+----------+----------+
| column_1 | BIGINT | true | data_... | 0 |
+-------------+---------+----------+----------+----------+
ヘッダー付き CSV ファイルの場合:
-- Create CSV file format with header support
CREATE FILE FORMAT csv_headers_format
TYPE = 'CSV'
field_delimiter = ','
skip_header = 1;
-- Export data with headers
CREATE STAGE test_csv_headers;
COPY INTO @test_csv_headers FROM (
SELECT number as user_id, 'user_' || number::string as user_name
FROM numbers(5)
) FILE_FORMAT = (TYPE = 'CSV', output_header = true);
-- Infer schema with headers
SELECT * FROM INFER_SCHEMA(
location => '@test_csv_headers',
file_format => 'csv_headers_format'
);
より高速に推論するためにレコード数を制限する場合:
-- Sample only first 5 records for schema inference
SELECT * FROM INFER_SCHEMA(
location => '@test_csv',
pattern => '.*[.]csv',
file_format => 'csv_format',
max_records_pre_file => 5
);
NDJSON ファイル
-- Create stage and export NDJSON data
CREATE STAGE test_ndjson;
COPY INTO @test_ndjson FROM (SELECT number FROM numbers(10)) FILE_FORMAT = (TYPE = 'NDJSON');
-- Infer schema using pattern and NDJSON format
SELECT * FROM INFER_SCHEMA(
location => '@test_ndjson',
pattern => '.*[.]ndjson',
file_format => 'NDJSON'
);
結果:
+-------------+---------+----------+----------+----------+
| column_name | type | nullable | filenames| order_id |
+-------------+---------+----------+----------+----------+
| number | BIGINT | true | data_... | 0 |
+-------------+---------+----------+----------+----------+
より高速に推論するためにレコード数を制限する場合:
-- Sample only first 5 records for schema inference
SELECT * FROM INFER_SCHEMA(
location => '@test_ndjson',
pattern => '.*[.]ndjson',
file_format => 'NDJSON',
max_records_pre_file => 5
);
複数ファイルでのスキーママージ
ファイルごとにスキーマが異なる場合、infer_schema はそれらを賢くマージします。
-- Suppose you have multiple CSV files with different schemas:
-- file1.csv: id(INT), name(VARCHAR)
-- file2.csv: id(INT), name(VARCHAR), age(INT)
-- file3.csv: id(FLOAT), name(VARCHAR), age(INT)
SELECT * FROM INFER_SCHEMA(
location => '@my_stage/',
pattern => '.*[.]csv',
file_format => 'csv_format'
);
結果には、マージされたスキーマが表示されます。
+-------------+---------+----------+-----------+----------+
| column_name | type | nullable | filenames | order_id |
+-------------+---------+----------+-----------+----------+
| id | VARCHAR | true | file1,... | 0 | -- INT+FLOAT→VARCHAR
| name | VARCHAR | true | file1,... | 1 |
| age | BIGINT | true | file1,... | 2 | -- Missing in file1→nullable
+-------------+---------+----------+-----------+----------+
パターンマッチングとファイル数の制限
パターンマッチングを使用すると、複数ファイルからスキーマを推論できます。
-- Infer schema from all CSV files in the directory
SELECT * FROM INFER_SCHEMA(
location => '@my_stage/',
pattern => '.*[.]csv'
);
パフォーマンスを向上させるために、処理するファイル数を制限できます。
-- Process only the first 5 matching files
SELECT * FROM INFER_SCHEMA(
location => '@my_stage/',
pattern => '.*[.]csv',
max_file_count => 5
);
圧縮ファイル
infer_schema は圧縮ファイルを自動的に処理します。
-- Works with compressed CSV files
SELECT * FROM INFER_SCHEMA(location => '@my_stage/data.csv.zip');
-- Works with compressed NDJSON files
SELECT * FROM INFER_SCHEMA(
location => '@my_stage/data.ndjson.xz',
file_format => 'NDJSON',
max_records_pre_file => 50
);
推論されたスキーマからテーブルを作成する
infer_schema 関数はスキーマを表示しますが、テーブルは作成しません。推論されたスキーマからテーブルを作成するには、次のようにします。
-- Create table structure from file schema
CREATE TABLE my_table AS
SELECT * FROM @my_stage/ (pattern=>'.*[.]parquet')
LIMIT 0;
-- Verify the table structure
DESC my_table;