由于 PySpark 时间戳,将 Spark 数据帧保存到 Azure Synapse 时出现问题

问题描述

我正在尝试将数据帧保存到 Azure Synapse 表中,但出现以下错误

com.microsoft.sqlserver.jdbc.sqlServerException: 107096;从 bcp 客户端收到一个无效的列长度,用于 colid...

问题在于我的数据框中的时间戳列,如下所示:2011-01-27T06:48:04.000+0000。但是,Synapse 中的目标列是 datatime2 类型,最大长度为 8

为此我尝试过

.withColumn("myTimestampColumn",to_timestamp(col("myTimestampColumn"),"yyyy-MM-dd HH:mm:ss"))

但格式不会改变。

有人知道如何解决这个问题吗?

需要注意的几点:

  • 如果数据框列是时间戳,Synapse 只会接受交易,目标列是 datetime2
  • 我正在使用 spark 2.4.5

解决方法

如果您在 Spark 中的日期时间列具有标准格式(例如 2011-01-27T06:48:04.000+0000),您可以直接转换为时间戳,这将导致格式为 yyyy-MM-dd HH:mm:ss

df2 = df.withColumn("myTimestampColumn",col("myTimestampColumn").cast("timestamp"))

然后您可以将 df2 保存到您的表中。