从 Databricks 将 PySpark 数据帧写入 Snowflake 需要很长时间

Ee *_* Ng 3 pyspark snowflake-cloud-data-platform azure-databricks

df.write.format("net.snowflake.spark.snowflake").options(**sfOptions).option("dbtable", "table_name").mode("overwrite").save()
Run Code Online (Sandbox Code Playgroud)

我在 Azure Databricks 中使用上述代码将 Spark 表写入 Snowflake 数据库,仅花费了 7 分钟多的时间才完成 900 万多行。

我使用节点类型为 Standard_D64s_v3(256GB,64 核)的单节点集群,并安装了 Maven 包“net.snowflake:spark-snowflake_2.12:2.5.1-spark_2.4”。

为了达到全速,我是否缺少一些设置?

Luk*_*zda 5

我建议检查是否sfOptions有选项"usestagingtable": "ON"

\n
\n

内部数据传输

\n
\n

通过连接器自动创建和管理的 Snowflake 内部阶段,可以促进两个系统之间的数据传输:

\n
    \n
  • 连接到 Snowflake 并在 Snowflake 中初始化会话后,连接器将创建内部阶段。
  • \n
  • 在 Snowflake 会话的整个持续时间内,连接器使用该阶段来存储数据,同时将数据传输到目的地。
  • \n
  • 在 Snowflake 会话结束时,连接器会删除阶段,从而删除阶段中的所有临时数据。
  • \n
\n

请注意,对内部传输的支持需要特定版本(或更高版本)的连接器,具体取决于您的 Snowflake 帐户的云平台:

\n
    \n
  • AWS 仅在连接器版本 2.2.0(及更高版本)中支持内部数据传输模式。
  • \n
  • Azure 仅连接器版本 2.4.0(及更高版本)支持内部数据传输模式。
  • \n
  • GCP 仅连接器版本 2.7.0(及更高版本)支持内部数据传输模式。
  • \n
\n
\n
\n

其他选项

\n
\n

使用临时表

\n

该参数控制数据加载是否使用临时表。

\n

临时表是由连接器创建的普通表(具有临时名称);如果数据加载操作成功,则删除原始目标表,并将临时表重命名为原始目标表\xe2\x80\x99s名称。如果数据加载操作失败,则暂存表将被删除,目标表将保留操作之前的数据。因此,如果操作失败,临时表允许保留原始目标表数据。为了安全起见,Snowflake 强烈建议在大多数情况下使用临时表。

\n

为了让连接器创建临时表,通过 Spark 连接器执行 COPY 的用户必须具有足够的权限来创建表。如果用户没有创建表的权限,则直接加载(即不使用临时表进行加载)非常有用。

\n
\n