由于 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 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章