从 Databricks 加载雪花更改 table 结构

Loading Snowflake from Databricks changes table structure

我正在做一些 POC 以从 Databricks 中的数据帧加载 Snowflake table。我已经成功加载了 table,但是它改变了它的结构。

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

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 中的代码取消 Python 时,table 成功加载,但是 table 的结构更改为:

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()

您是否知道为什么 table 结构在 Snowflake 中发生了变化?

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

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