我有一个包含列列表的数据框;其中一列是具有不同长度的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的新手,不知道从哪里开始。
有什么建议?
一种方法是首先通过key_time
将regexp_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|
// +-----------+------------------------+----------------------+