Scala spark rdd时间戳转换
我有一个文本文件。我有两个字段:开始时间和结束时间。我想找出这两次之间的区别Scala spark rdd时间戳转换,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有一个文本文件。我有两个字段:开始时间和结束时间。我想找出这两次之间的区别 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.t
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查找开始时间(w(2))和结束时间(w(3))之间的时间戳差异。您必须将字符串日期转换为有效日期,即从
2017-10-23T07:13:45.567+5:30
到2017-10-23 07:13:45
,然后您可以使用SimpleDateFormat
将日期转换为长
,以便对其进行算术运算
简而言之,您可以执行以下操作
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
})
我希望答案是有帮助的我建议您使用数据集
而不是rdd
,这样您就可以使用案例类
,因为数据集
比rdd
优化,而且比rdd
有很多选项
假设您有一个文本文件,其中包含以下无标题的数据
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 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\u 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 |
+----+---+-------------------+-------------------+---+----------+
我希望答案有帮助@Khumar你能解释一下是什么原因让你否决了答案吗?