我有一个Spark管道,其中有3个DataFrame.write
,并且我想输出每次写入完成时的时间戳。我这样尝试过:
val timeFormat = new SimpleDataFormat("HH:mm:ss")
val calendar = Calendar.getInstance()
df.groupby(...)
.agg(...)
.write
.csv(...)
println(timeFormat.format(calendar.getTime))
但是我在输出中看到的是:
2018-07-04 12:31:55 INFO DAGScheduler:54 - Job 5 finished ...
12:25:56
我需要的是工作的真正结局,所以这里12:31:55
。如何获得正确的时间?
为什么会这样?我认为这与驱动程序脚本有关,该驱动程序脚本仅生成执行程序进程但仍在运行,而不是实际上在执行打印语句之前等待作业完成。这是正确的吗?
答案 0 :(得分:2)
正如Manoj Kumar正确提到的那样,获取执行后的时间,只是添加一点,使用一个函数获取结束时间,以便您可以重用。
scala> import java.text.SimpleDateFormat
import java.text.SimpleDateFormat
scala>
scala> def getEndTime[T](fn: => T): (T, String) = {
| val result = fn
| (result, new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(System.currentTimeMillis()))
| }
getEndTime: [T](fn: => T)(T, String)
scala>
scala> def add(a : Int, b : Int) : Int = {
| a + b
| }
add: (a: Int, b: Int)Int
scala>
scala> val (result, endTime) = getEndTime { add(10, 5) }
result: Int = 15
endTime: String = 2018/07/04 07:18:58
scala>
scala> val (result, endTime) = getEndTime { 10 + 5 }
result: Int = 15
endTime: String = 2018/07/04 07:19:00
因此,您可以编写如下内容:
val (_, endTime) = getEndTime { df.groupby(...)
.agg(...)
.write
.csv(...)}
答案 1 :(得分:1)
像下面的write
函数之后,您必须花些时间
import java.text.SimpleDateFormat
df.groupby(...)
.agg(...)
.write
.csv(...)
val currentTime=new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(System.currentTimeMillis())