【问题标题】:Snowflake External table requires postional columns issue雪花外部表需要位置列问题
【发布时间】:2019-11-21 02:59:33
【问题描述】:

我面临一个问题,即提取的文件列可能会因不同而发生变化: 例如:
第 1 天,文件可能有 3 列:c1、c2、c3 在第 2 天,文件可能有 5 列:c1、c3、c2、c4、c5 注意第二个文件中 c3 的列位置。

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

【问题讨论】:

    标签: snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    你没有告诉任何关于正在使用的格式。

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

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

    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替换。

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多