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

如何在Scala中将时间戳调整为毫秒?,scala,apache-spark,apache-spark-sql,spark-streaming,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,我有一个dataframe,它有一个列列表;其中一列是长度不同的键时间。我需要在第二部分将所有键的时间长度保持为毫秒,如下所示: 原始键时间列: +--------------------+----------------------+ |account_id |key_time. | +--------------------+----------------------+ |9999999. |2018-07-0

我有一个dataframe,它有一个列列表;其中一列是长度不同的键时间。我需要在第二部分将所有键的时间长度保持为毫秒,如下所示:

原始键时间列:

  +--------------------+----------------------+
  |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 |
  +--------------------+----------------------==+
我可以用column(“key_time”,logic(此处))
df=df?我是Scala的新手,不知道从哪里开始


有什么建议吗?

一种方法是首先通过
regexp\u extract
key\u-time
转换为有效的时间戳格式,然后使用
date\u-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|
// +-----------+------------------------+----------------------+

是键时间列时间戳的类型?还是字符串?@Misha,而不是
6
,如果你想将精度降低到毫秒,是否应该将其填充或修剪为
5
位(即2代表秒+3代表毫秒)?哦,是的,我错过了数字,没错,是5位@LeoC@Shaido,它是时间戳的类型,我想我可能需要把它转换成字符串,然后再做一个子字符串?但如果不是毫秒,我仍然需要填充0