Snowflake外部表需要发布位置列

时间:2019-11-21 02:59:33

标签: snowflake-data-warehouse snowflake-schema

我遇到了一个问题,其中提取的文件列可能会有所不同: 例如:
在第1天,文件可能有3列:c1,c2,c3 在第2天,文件可能有5列:c1,c3,c2,c4,c5 注意第二个文件中c3的列位置。

在c1之后引入c3列,因此无法在雪花中使用外部阶段语法中的“复制到”功能。 尝试使用外部表,但它也需要位置列才能工作。 有没有人知道如何加载这些类型的文件?

1 个答案:

答案 0 :(得分:1)

您没有告诉任何有关所使用格式的信息。

加载不同列的唯一方法是将文件作为单个列加载,例如。 FIELD_DELIMITER = NONE并拆分并转换为OBJECT,每个文件列均作为属性。

如果第一条记录包含字段名称c1 ... c n ,则可以加载:

WITH
  file AS (SELECT * FROM VALUES ('c1,c2,c3'), ('1,2,3'), ('11,22,33') t(REC)),
  split_file AS (SELECT * FROM file CROSS JOIN LATERAL SPLIT_TO_TABLE(REC, ','))
  combined_table AS (
    SELECT content.SEQ - 1 REC_NO, OBJECT_AGG(headers.VALUE, content.VALUE::VARIANT) OBJ
    FROM split_file content
    INNER JOIN split_file headers
          ON content.INDEX = headers.INDEX AND content.SEQ > 1 AND headers.SEQ = 1
    GROUP BY content.SEQ
  )
SELECT OBJ:c1::NUMBER c1, OBJ:c2::NUMBER c2, OBJ:c3::NUMBER c3, OBJ:c4::NUMBER c4
FROM combined_table;

上面的示例将所有内容组合到一个查询中,但是在这种情况下,您必须分别聚合每个文件,并将INSERT(附加)聚合到combined_table

之所以可行,是因为您可以引用不存在的对象属性(列)(例如 c4 ),并将它们替换为NULL