如何在Scala中将时间戳大小调整为毫秒?

问题描述 投票:0回答:1

我有一个包含列列表的数据框;其中一列是具有不同长度的key_time。我需要在第二部分中将所有key_time长度保持为毫秒,如:

原始key_time列:

  +--------------------+----------------------+
  |account_id          |key_time.             |
  +--------------------+----------------------+
  |9999999.            |2018-07-01 12:32:0424 |
  +--------------------+----------------------+

这就是我要的:

  +--------------------+------------------------+
  |account_id          |key_time.               |
  +--------------------+------------------------+
  |9999999.            |2018-07-01 12:32:042400 |
  +--------------------+----------------------==+

如果第二部分通过6位数,那么我需要将它切成6:

  +--------------------+------------------------+
  |account_id          |key_time.               |
  +--------------------+------------------------+
  |9999999.            |2018-07-01 12:32:123456 |
  +--------------------+----------------------==+

我可以做df = df.withColumn("key_time", logic (here))吗?我是Scala的新手,不知道从哪里开始。

有什么建议?

scala apache-spark apache-spark-sql spark-streaming
1个回答
0
投票

一种方法是首先通过key_timeregexp_extract转换为有效的时间戳格式,然后使用date_format将其塑造为所需的格式:

val df = Seq(
  (101, "2018-07-01 12:32:0424"),
  (102, "2018-07-01 12:32:123456")
).toDF("account_id ", "key_time")

val pattern = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(.*)"

df.
  withColumn("key_time_1", regexp_extract($"key_time", pattern, 1)).
  withColumn("key_time_2", regexp_extract($"key_time", pattern, 2)).
  withColumn("key_timestamp", concat($"key_time_1", lit("."), $"key_time_2")).
  withColumn("key_time", date_format($"key_timestamp", "yyyy-MM-dd HH:mm:ssSSS")).
  select("account_id ", "key_timestamp", "key_time").
  show(false)

// +-----------+------------------------+----------------------+
// |account_id |key_timestamp           |key_time              |
// +-----------+------------------------+----------------------+
// |101        |2018-07-01 12:32:04.24  |2018-07-01 12:32:04240|
// |102        |2018-07-01 12:32:12.3456|2018-07-01 12:32:12345|
// +-----------+------------------------+----------------------+
© www.soinside.com 2019 - 2024. All rights reserved.