从 Databricks 加载雪花会更改表结构

Posted

技术标签:

【中文标题】从 Databricks 加载雪花会更改表结构【英文标题】:Loading Snowflake from Databricks changes table structure 【发布时间】:2020-01-16 22:15:42 【问题描述】:

我正在做一些 POC 以从 Databricks 中的数据框中加载雪花表。我已经成功加载了表格,但是它改变了它的结构。

例如,我在 Snowflake 中创建了这个表:

CREATE OR REPLACE TABLE FNT_DAYS
(
    FNT_DT_PK TIMESTAMP_NTZ NOT NULL,
    OPEN_DT_FLG VARCHAR(1),
    HOLIDAY_DT_FLG VARCHAR(1),
    LOAD_USR VARCHAR(10)
);

ALTER TABLE FNT_DAYS ADD CONSTRAINT FNT_DAYS_PK PRIMARY KEY (FNT_DT_PK);

当我在 Databricks unsing Python 中运行我的代码时,表格被成功加载,但是表格的结构更改为:

CREATE OR REPLACE TABLE FNT_DAYS
    (
        FNT_DT_PK TIMESTAMP_NTZ,
        OPEN_DT_FLG VARCHAR(16777216),
        HOLIDAY_DT_FLG VARCHAR(16777216),
        LOAD_USR VARCHAR(10)
    );

请注意,主键约束已消失,FNT_DT_PK 字段不再为 NOT NULL,最后,每个 VARCHAR 字段数据类型长度都更改为 16777216。

我在 Databricks 中的 python 代码非常简单:

%python

options = dict(sfUrl="mysnflk.snowflakecomputing.com",
               sfUser="me",
               sfPassword="******",
               sfDatabase="SNF_DB",
               sfSchema="PUBLIC",
               sfWarehouse="SNF_WH")

df = spark.sql("select * from exc.test")

df.write \
  .format("snowflake") \
  .mode("overwrite") \
  .options(**options) \
  .option("dbtable", "FNT_DAYS") \
  .save()

您知道为什么 Snowflake 中的表结构会发生变化吗?

【问题讨论】:

【参考方案1】:

如果您查看 Snowflake 中的 query_history,您是否看到该表正在由 df.write 命令重新创建?似乎它正在重新创建表并使用数据框的数据类型来定义您的新表。我不知道具体是什么原因造成的,但我确实看到 Snowflake 示例 (https://docs.snowflake.net/manuals/user-guide/spark-connector-use.html#id1) 在您的模式下的语法略有不同。

我还应该注意,这些 varchar 字段的长度在 Snowflake 中不会以任何方式伤害您。长度不会影响存储或性能,这些长度意味着连接器实际上只是使用 VARCHAR 作为数据类型而没有指定长度。此外,对 PK 的限制并未强制执行,因此不确定这对您有多重要。我唯一关心的是你的 NOT NULL,Snowflake 确实强制执行。

【讨论】:

只是一些关于 Mike 提到的关于 VARCHAR 长度不会伤害你的额外文档:community.snowflake.com/s/article/… 感谢两位的回答。我对来自 Netezza 心态的 Snowflake 很陌生,所以这里有很多要理解的地方。再次感谢您。

以上是关于从 Databricks 加载雪花会更改表结构的主要内容,如果未能解决你的问题,请参考以下文章

Databricks - 从增量表写入流到 orc 文件的读取流仅具有更改

每天从 S3 存储桶加载一个新文件到雪花表

雪花外部表:添加新列

Snowflake - 读取实现的架构

从 Databricks 到 Azure Synapse Analytics:当我们将数据帧加载到表中时,为啥需要将 parquet.writeLegacyFormat 设置为 True?

检查雪花中的表架构更改