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

Posted

技术标签:

【中文标题】由于 PySpark 时间戳,将 Spark 数据帧保存到 Azure Synapse 时出现问题【英文标题】:Problem on saving Spark dataframe into Azure Synapse due to PySpark timestamp 【发布时间】:2021-05-22 01:48:29 【问题描述】:

我正在尝试将 Dataframe 保存到 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

【问题讨论】:

“格式不会改变”是什么意思?你能做一个df.show() 并在withColumn 之前和之后发布输出吗?从代码的角度来看,为强制转换的列使用不同的别名而不是重用相同的名称也会更简洁。 【参考方案1】:

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

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

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

【讨论】:

以上是关于由于 PySpark 时间戳,将 Spark 数据帧保存到 Azure Synapse 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyspark 中将字符串更改为时间戳?

在 Pyspark 中列出保存顺序的数据框列

如何在 PySpark 中将 unix 时间戳列转换为人类可理解的时间戳? [复制]

在 pyspark sql 中查找两个时间戳之间的差异

将最大值时间戳放入 PySpark 中的数组中

Pyspark 列:将字符串格式的数据转换为时间戳格式