Spark:获取操作结束/写入的时间戳

时间:2018-07-04 10:50:30

标签: scala apache-spark time

我有一个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。如何获得正确的时间?

为什么会这样?我认为这与驱动程序脚本有关,该驱动程序脚本仅生成执行程序进程但仍在运行,而不是实际上在执行打印语句之前等待作业完成。这是正确的吗?

2 个答案:

答案 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())