我有RDD[(String,Map[String,List[Product with Serializable]])]
,例如:
(1566,Map(data1 -> List(List(1469785000, 111, 1, 3, null, 0),List(1469785022, 111, 1, 3, null, 0)), data2 -> List((4,88,1469775603,1,3370,f,537490800,661.09)))
我想创建一个新的RDD,它将包含data1
列表的尾部和头部子列表之间的时差(转换为分钟)。
例如,在上面的数据示例中,这指的是1469785022
- 1469785000
。
我编写了以下代码,但失败了,错误为java.lang.IndexOutOfBoundsException: 0
。似乎tail
和head
无法按预期工作。如何解决这个问题?
val newRDD = currentRDD.map({
line => Map(("id",line._1),
("duration", (line._2.get("data1").get.tail.productElement(0).toString.toLong -
line._2.get("data1").get.head.productElement(0).toString.toLong) / 60)
)
})
答案 0 :(得分:0)
您无法理解什么是head
,什么是tail
。
Scala中的List()
对象有头部和尾部。如果您有这样的列表:
scala> val list = List(10, 20, 30)
头部和尾部的结构将是这样的:
scala> list.head
res0: Int = 10
scala> list.tail
res1: List[Int] = List(20, 30)
因此,在您使用tail
的代码中,您正在使用List[Int]
对象。您可以使用tail.head
这样解决:
line._2.get("data1").get.tail.head.productElement(0).toString.toLong