我有一个文本文件。在那里我有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))之间的时间戳差异。
答案 0 :(得分:1)
我建议您使用dataSet
而非rdd
,以便您可以使用case class
,因为dataSets
已优化而不是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
为
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:30
到2017-10-23 07:13:45
,然后您可以使用SimpleDateFormat
将date
转换为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
})
我希望答案很有帮助