Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala spark rdd时间戳转换_Scala_Apache Spark_Rdd - Fatal编程技术网

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你能解释一下是什么原因让你否决了答案吗?