【问题标题】:Spark fails to convert String to TIMESTAMPSpark 无法将 String 转换为 TIMESTAMP
【发布时间】:2019-12-10 02:47:05
【问题描述】:

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

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

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

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()

给出了很好的结果(带有字符串值的列)。所以 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 列。

有什么问题?

【问题讨论】:

    标签: scala dataframe apache-spark time hive


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我已经试过了。仍然返回 Null。对于列
    • 可能是因为 Spark 时间戳类型以秒为单位,并且您的精度更高。在应用 to_timestamp 之前尝试修剪字符串或将格式更改为yyyy-MM-dd HH:mm:ss.SSS
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 2020-11-05
      • 2021-08-09
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2021-10-13
      相关资源
      最近更新 更多