Spark无法将String转换为TIMESTAMP

时间:2019-08-01 13:27:28

标签: scala dataframe apache-spark time hive

我有一个包含String列的配置单元表:这是一个示例:

| DT                            |                                                       
|-------------------------------|
| 2019-05-07 00:03:53.837000000 |                                                         

当我尝试在Spark-Scala DF中导入表时,将String转换为时间戳,我只有空值:

val df = spark.sql(s"""select to_timestamp(dt_maj, 'yyyy-MM-dd HH:mm:ss.SSS') from ${use_database}.pz_send_demande_diffusion""").show()


| DT   |                                                       
|------|
| null |

val df = spark.sql(s"""select dt from ${use_database}.pz_send_demande_diffusion""").show()

给出良好的结果(带有String值的列)。因此,Spark通常会导入te列。

我也尝试过:

val df = spark.sql(s"""select to_timestamp('2005-05-04 11:12:54.297', 'yyyy-MM-dd HH:mm:ss.SSS') from ${use_database}.pz_send_demande_diffusion""").show()

它奏效了!它返回TIMESTAMPs列。

出什么问题了?

2 个答案:

答案 0 :(得分:2)

我认为您应该对此类数据yyyy-MM-dd HH:mm:ss.SSSSSSSSS使用以下格式2019-05-07 00:03:53.837000000

答案 1 :(得分:2)

修剪多余的0。然后,

df.withColumn("new", to_timestamp($"date".substr(lit(1),length($"date") - 6), "yyyy-MM-dd HH:mm:ss.SSS")).show(false)

结果是:

+-----------------------------+-------------------+
|date                         |new                |
+-----------------------------+-------------------+
|2019-05-07 00:03:53.837000000|2019-05-07 00:03:53|
+-----------------------------+-------------------+

架构:

root
 |-- date: string (nullable = true)
 |-- new: timestamp (nullable = true)