簡體   English   中英

如何在Scala中更新日期格式的列

[英]How to Update a column in Scala which is in Date Format

在Spark Scala中需要幫助以編寫以下問題的代碼。 我有一個文件,記錄如下。

aaa|2019-07-11 02:15:50

bbb|2019-07-03 22:21:50

vvv|2019-07-03 19:30:40

bzx|2019-07-11 02:15:30

rrr|2019-06-24 01:29:10

mmm|2019-06-23 20:35:05

qqq|2019-07-12 08:10:15

eee|2019-07-11 01:49:30

iii|2019-06-23 22:31:45

我已分割文件並接第二列

val file = spark.read.format("csv").option("delimiter", """|""").load(pathOfDumpfile).toDF()  

現在我需要將“ 0000-00-00 00:00:05”添加到文件的所有值(日期格式的第二列)中,並將其保存為以下文件

aaa|2019-07-11 02:15:55

bbb|2019-07-03 22:21:55

vvv|2019-07-03 19:30:45

bzx|2019-07-11 02:15:35

rrr|2019-06-24 01:29:15

mmm|2019-06-23 20:35:10

qqq|2019-07-12 08:10:20

eee|2019-07-11 01:49:35

iii|2019-06-23 22:31:50

誰能建議我如何向文件/列中的所有記錄添加+ 5秒。

確實會有所幫助。 在日期時間字段中添加后,秒或分鍾應更改,它不應像其2019-07-11 23:59:59那樣影響日期,然后即使在秒上添加1也將是2019-07-12 00: 00:00。 我想添加但不想更改日期,因此,我應該如何更改日期,僅在分鍾或秒內進行更改。

你可以通過使用unix_timestamp來做

scala>  var dfv = Seq(("aaa","2019-07-11 23:59:59"),("bbb","2019-07-03 22:21:50"),("vvv","2019-07-03 19:30:40"),("bzx","2019-07-11 02:15:30"),("rrr","2019-06-24 01:29:10"),("mmm","2019-06-23 20:35:05"),("qqq","2019-07-12 08:10:15"),("eee","2019-07-11 01:49:30"),("iii","2019-06-23 22:31:45")).toDF("value","_date")

scala> dfv.show
+-----+-------------------+
|value|              _date|
+-----+-------------------+
|  aaa|2019-07-11 23:59:59|
|  bbb|2019-07-03 22:21:50|
|  vvv|2019-07-03 19:30:40|
|  bzx|2019-07-11 02:15:30|
|  rrr|2019-06-24 01:29:10|
|  mmm|2019-06-23 20:35:05|
|  qqq|2019-07-12 08:10:15|
|  eee|2019-07-11 01:49:30|
|  iii|2019-06-23 22:31:45|
+-----+-------------------+

scala> dfv.withColumn("_date_v1",when(date_format(from_unixtime(unix_timestamp($"_date")),"HH:mm:ss ")>"23:59:55",$"_date").otherwise(from_unixtime(unix_timestamp($"_date")+5,"yyyy-MM-dd HH:mm:ss"))).show
+-----+-------------------+-------------------+
|value|              _date|           _date_v1|
+-----+-------------------+-------------------+
|  aaa|2019-07-11 23:59:59|2019-07-11 23:59:59|
|  bbb|2019-07-03 22:21:50|2019-07-03 22:21:55|
|  vvv|2019-07-03 19:30:40|2019-07-03 19:30:45|
|  bzx|2019-07-11 02:15:30|2019-07-11 02:15:35|
|  rrr|2019-06-24 01:29:10|2019-06-24 01:29:15|
|  mmm|2019-06-23 20:35:05|2019-06-23 20:35:10|
|  qqq|2019-07-12 08:10:15|2019-07-12 08:10:20|
|  eee|2019-07-11 01:49:30|2019-07-11 01:49:35|
|  iii|2019-06-23 22:31:45|2019-06-23 22:31:50|
+-----+-------------------+-------------------+

讓我知道您是否有與此相關的任何問題。

您可以在自定義udf的幫助下完成此操作,例如:

import org.apache.spark.sql.functions.{col, udf}

val file = spark.read.format("csv").option("delimiter", """|""").load(pathOfDumpfile).toDF("a", "b")

val timeUDF = udf((x: java.sql.Timestamp) => new java.sql.Timestamp(time.getTime + 5000)) //getTime returns ms

file.select(col("a"), timeUDF(col("b")))
.write(...)

您可以在spark中使用INTERVAL語法。

使用數據框:

val foo = spark.sql(""" select current_timestamp as ts """)
foo.select($"ts", $"ts" + expr("INTERVAL 5 SECONDS") as "ts_plus").show(false)
+-----------------------+-----------------------+
|ts                     |ts_plus                |
+-----------------------+-----------------------+
|2019-09-16 10:33:17.626|2019-09-16 10:33:22.626|
+-----------------------+-----------------------+

使用Spark SQL:

foo.createOrReplaceTempView("fooView")
spark.sql(""" select ts, ts + INTERVAL 5 seconds from fooView""").show(false)
+-----------------------+------------------------------------------+
|ts                     |CAST(ts + interval 5 seconds AS TIMESTAMP)|
+-----------------------+------------------------------------------+
|2019-09-16 10:35:12.847|2019-09-16 10:35:17.847                   |
+-----------------------+------------------------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM