雪花镶木地板加载模式生成

问题描述 投票:0回答:2

致力于将 parquet 文件从 S3 位置加载到雪花表。这就是我正在做的事情:

  1. 创建目标表
CREATE TABLE myschema.target_table(
 col1 DATE,
 col2 VARCHAR);
  1. 使用以下命令创建阶段表
CREATE OR REPLACE TEMPORARY STAGE myschema.stage_table 
   url = 's3://mybucket/myfolder1/' 
 storage_integration = My_int 
 fileformat = (type = 'parquet')
  1. 从阶段表加载目标表
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)
snowflake-cloud-data-platform parquet
2个回答
2
投票

你尝试过吗 MATCH_BY_COLUMN_NAME = CASE_SENSITIVE |不区分大小写 |无

文档:https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html#type-parquet


0
投票

您可以使用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;
© www.soinside.com 2019 - 2024. All rights reserved.