【问题标题】:Snowflake - Schema On Read ImplementationSnowflake - 读取实现的架构
【发布时间】:2026-02-15 15:20:03
【问题描述】:

我们正在考虑实施 Schema on Read 以将数据加载到雪花表中。我们在 AWS S3 路径中接收 .csv 文件,该路径将成为我们表的来源。但是这些提要文件的结构经常更改,我们不想在每次更改文件的架构时手动更改已创建的表。我们希望根据文件的架构更改方式自动化将文件加载到雪花表的整个过程,并且我们不希望每次向文件添加/删除新属性时都创建一个新表。如果有人可以帮助我们就如何更好地实现这一点提出建议,那将非常有帮助。

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    一种方法可能如下:

    • 将数据加载到临时表中。可以使用空白标题(col1、col2 ... colX)或使用 CREATE TABLE AS SELECT $1, $2 ... $X from @stage. 随时创建此暂存表
    • 创建一个动态查询,它将从临时表中获取标题,然后生成一个插入/合并查询以将数据加载到您的最终表中。这可以使用存储过程来完成。

    【讨论】:

      【解决方案2】:

      Snowflake 支持使用标准 SQL 来查询位于内部(即 Snowflake)阶段或命名外部(Amazon S3、Google Cloud Storage 或 Microsoft Azure)阶段的数据文件。这对于检查/查看暂存文件的内容很有用,尤其是在加载数据之前或卸载数据之后。

      此外,通过引用暂存文件中的[元数据列][1],暂存数据查询可以返回有关文件的附加信息,例如文件名和行号。

      Snowflake 利用对分段数据查询的支持来启用[在加载期间转换数据][2]。

      更多详情:https://docs.snowflake.com/en/user-guide/querying-stage.html [1]:https://docs.snowflake.com/en/user-guide/querying-metadata.html [2]:https://docs.snowflake.com/en/user-guide/data-load-transform.html

      【解决方案3】:

      有一个功能可以推断架构并创建表(目前处于预览状态):

      CREATE TABLE … USING TEMPLATE:

      创建表…使用模板

      使用从一组包含半结构化数据的暂存文件派生的列定义创建一个新表。此功能目前仅限于 Apache Parquet、Apache Avro 和 ORC 文件。

      ...

      此示例基于 INFER_SCHEMA 主题中的示例:

      CREATE TABLE mytable
        USING TEMPLATE (
          SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*))
            FROM TABLE(
              INFER_SCHEMA(
                LOCATION=>'@mystage',
                FILE_FORMAT=>'my_parquet_format'
              )
            ));
      

      INFER_SCHEMA:

      自动检测一组包含半结构化数据的暂存数据文件中的文件元数据架构并检索列定义。使用列定义来简化登录表或外部表的创建以查询数据。

      此功能目前仅限于 Apache Parquet、Apache Avro 和 ORC 文件。

      【讨论】:

      • 恐怕他需要这个用于结构化数据(.cvs 文件)。不适用于半结构化数据。
      • @CMe 我写这个答案时考虑到了问题的主题“模式读取”。此功能处于预览阶段,仍在不断发展,因此也可以添加 csv。但是在撰写本文时您是对的,它不支持 CSV