我有一个包含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列。
出什么问题了?
答案 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)