当前位置: 首页 > 知识库问答 >
问题:

从Databricks中加载雪花改变表结构

隆宏爽
2023-03-14

我正在做一些POC来从Databrics中的dataframe中加载雪花表。我已经成功地加载了表,但是它改变了表的结构。

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

你知道为什么在雪花中改变了表的结构吗?

共有1个答案

晏卓君
2023-03-14

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

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

 类似资料:
  • 我无法从亚马逊S3桶加载雪花中的外部表。外部表创建成功,但在运行select命令时,不会返回任何内容。奇怪的是COPY into命令对雪花中的同一个表起作用。 谢谢,纳维德

  • 我使用的是spark 2.4.7和spark-snowflake 2.8.4,以及snowflake jdbc 3.12.17。我在Mac OS X Big Sur上。这发生在我升级到大苏尔之后,尽管我不确定这是否有关系。 我试过: 将bouncy castle提供程序作为包依赖项添加到我的配置中 检查是否指向Java 8(它确实指向) 重新安装java 8(使用homebrew和adoptope

  • 我试图使用以下代码将数据加载到雪花,但得到一个错误。 tmp是从Snowflake下载的,该表使用RStudio:

  • 如何使用雪花存储过程将current_date()bind变量插入到表中 创建或替换过程abc(“p_message_id”浮点数、“p_theater”字符串、“p_month”字符串、“p_message”字符串、“p_message”字符串、“p_start_date”字符串、“p_end_date”字符串、“p_action”字符串、“p_msg_type”字符串、“p_logged_us

  • 我如何一次加载5年的拼花数据并复制到一个表中?因为1个月的负荷比我1.5个小时,5年就要花我90个小时。如果有可能并行加载?我该怎么做呢? 谢谢