致力于将 parquet 文件从 S3 位置加载到雪花表。这就是我正在做的事情:
CREATE TABLE myschema.target_table(
col1 DATE,
col2 VARCHAR);
CREATE OR REPLACE TEMPORARY STAGE myschema.stage_table
url = 's3://mybucket/myfolder1/'
storage_integration = My_int
fileformat = (type = 'parquet')
COPY INTO myschema.target_table FROM(
SELECT $1:col1::date,
$1:col2:varchar
FROM myschema.stage_table)
这工作正常,我的问题是,我有 10 个表和 10 个列。有什么方法可以优化步骤 3,我不必显式提及列名,这样代码就会变得通用:
COPY INTO myschema.target_table FROM(
SELECT *
FROM myschema.stage_table)
你尝试过吗 MATCH_BY_COLUMN_NAME = CASE_SENSITIVE |不区分大小写 |无
文档:https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html#type-parquet
您可以使用INFER_SCHEMA和TEMPLATE而不是ARRAY_AGG来生成基于阶段的表。为了避免由于列元数据大小限制而导致的爆炸,您可以根据阶段位置中的第一个文件进行推理
SET FIRST_FILENAME_IN_STAGE =
(SELECT SPLIT_PART(METADATA$FILENAME, '/', -1)
FROM @MY_STAGE(file_format => aws_parquet) limit 1);
SET PATH_OF_FIRST_FILE_NAME = '@MY_STAGE' || $FIRST_FILENAME_IN_STAGE;
CREATE OR REPLACE EXTERNAL TABLE MY_TABLE_EXTERNAL
USING TEMPLATE (
SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*))
FROM TABLE(
INFER_SCHEMA(
LOCATION=>$PATH_OF_FIRST_FILE_NAME,
FILE_FORMAT=>'aws_parquet'
)
)
)
LOCATION=@MY_STAGE
FILE_FORMAT=aws_parquet
AUTO_REFRESH=false;