0

我在尝试使用此复制到命令从 S3 阶段(具有列标题但与目标雪花表的顺序不同的顺序)复制到雪花数据库时遇到问题

COPY INTO db.schema.table FROM @stage/file.csv 
FILE_FORMAT=(TYPE= CSV field_delimiter ='|' SKIP_HEADER =1) ;

有什么方法可以按照与雪花中的目标表类似的顺序推送文件?

我也尝试在 COPY 命令中使用 SELECT,但没有运气,因为我们必须对订单进行硬编码。这很乏味,而且不是我想要的,因为我需要为许多表编写。

我看到有 MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE复制选项,但它不支持 CSV 文件或结构化数据

4

2 回答 2

0

正如您所说,本地执行此操作的唯一方法是这样的:

    COPY INTO db.schema.table
    (
    col1
    , col2
    , col3
    , col4 
    )
  FROM (SELECT t.$4,t.$3,t.$2,t.$1
        FROM @stage/file.csv AS t);

但是,如果您想让它更加自动化并按列名匹配,则必须编写一个执行动态复制到语句的存储过程。或查看第 3 方工具。首先,您可以构建一个存储过程:

  1. 查询表 DDL 以获取表的列信息:

    SELECT * FROM db.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table';

  2. 迭代 information_schema 中的列数,并在暂存文件上构建动态查询以获取标题列名称:

    SELECT t.$1,t.$2,t.$3,t.$4 FROM @stage/file.csv AS t ORDER BY metadata$file_row_number ASC LIMIT 1

  3. 根据从阶段查询返回的列的顺序生成动态 COPY INTO 语句。这将假定文件中的标题列与雪花表列名匹配。

如果今晚/明天我有更多时间,我将整理一个工作示例并更新此答案。

于 2020-07-08T21:51:22.677 回答
0

您必须自己做,或者使用能够为您完成工作的工具。Snowflake 无法为您构建这个。

FiveTran 和 Matillion 之类的工具足以胜任此任务,但在我看来,它们非常昂贵,而且在许多情况下不值得花费这些成本。

就个人而言,我建议您最好的选择是编写一个脚本来生成COPY INTO您之前为您提到的乏味语句。

于 2020-07-08T19:40:01.440 回答