从 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 文件的读取流仅具有更改
从 Databricks 到 Azure Synapse Analytics:当我们将数据帧加载到表中时,为啥需要将 parquet.writeLegacyFormat 设置为 True?