从 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 确实强制执行。
我正在做一些 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 确实强制执行。