spark rdd时间戳转换

时间:2017-10-30 09:11:04

标签: scala apache-spark rdd

我有一个文本文件。在那里我有2个字段的开始时间和结束时间。我想找到这两次之间的区别。

name,id,starttime,endtime,loc
xxx,123,2017-10-23T07:13:45.567+5:30,2017-10-23T07:17:40.567+5:30,zzz
xya,134,2017-10-23T14:17:25.567+5:30,2017-10-23T15:13:45.567+5:30,yyy

我已将此文件加载到rdd。

   val rdd1=sparkcontext.textFile("/user/root/file1.txt")
    case class xyz(name:String,id:Int,starttime:String,endtime:String,loc:String)
    val rdd2=rdd1.map{x =>
    val w=rdd2.split(',')
xyz(w(0),w(1),w(2),w(3),w(4))
}

如何使用RDD找到starttime(w(2))和endtime(w(3))之间的时间戳差异。

2 个答案:

答案 0 :(得分:1)

我建议您使用dataSet而非rdd,以便您可以使用case class,因为dataSets已优化而不是rddrdd更多选项。

假设您的文本文件包含以下没有标题的数据

xxx,123,2017-10-23T07:13:45.567+5:30,2017-10-23T07:17:40.567+5:30,zzz
xya,134,2017-10-23T14:17:25.567+5:30,2017-10-23T15:13:45.567+5:30,yyy

case class

case class xyz(name:String,id:Int,starttime:String,endtime:String,loc:String)

第一步是将文本文件转换为dataSet

val rdd1=sparkcontext.textFile("/user/root/file1.txt")
val dataSet = rdd1
  .map(x => x.split(','))
  .map(w => xyz(w(0), w(1).toInt, w(2).replace("T", " ").substring(0, w(2).indexOf(".")), w(3).replace("T", " ").substring(0, w(3).indexOf(".")), w(4)))
  .toDS()

如果您执行dataSet.show(false),那么您应该获得dataset

+----+---+-------------------+-------------------+---+
|name|id |starttime          |endtime            |loc|
+----+---+-------------------+-------------------+---+
|xxx |123|2017-10-23 07:13:45|2017-10-23 07:17:40|zzz|
|xya |134|2017-10-23 14:17:25|2017-10-23 15:13:45|yyy|
+----+---+-------------------+-------------------+---+

现在您只需调用unix_timestamp函数即可找到差异

import org.apache.spark.sql.functions._
dataSet.withColumn("difference", unix_timestamp($"endtime") - unix_timestamp($"starttime")).show(false)

应该以

结果
+----+---+-------------------+-------------------+---+----------+
|name|id |starttime          |endtime            |loc|difference|
+----+---+-------------------+-------------------+---+----------+
|xxx |123|2017-10-23 07:13:45|2017-10-23 07:17:40|zzz|235       |
|xya |134|2017-10-23 14:17:25|2017-10-23 15:13:45|yyy|3380      |
+----+---+-------------------+-------------------+---+----------+

我希望答案很有帮助

答案 1 :(得分:0)

您必须将字符串日期转换为有效日期,即从 2017-10-23T07:13:45.567+5:302017-10-23 07:13:45,然后您可以使用SimpleDateFormatdate转换为long,以便对其进行算术运算

简而言之,您可以执行以下操作

val rdd1=sparkcontext.textFile("/user/root/file1.txt")
val rdd2=rdd1
  .map(x => x.split(','))
  .map(w => (w(2).replace("T", " ").substring(0, w(2).indexOf(".")), w(3).replace("T", " ").substring(0, w(3).indexOf("."))))

val difference = rdd2.map(tuple => {
  val format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  val startDate = format.parse(tuple._1).getTime
  val endDate = format.parse(tuple._2).getTime
  endDate - startDate
})

我希望答案很有帮助