列表的尾部和头部子列表的字段之间的区别:java.lang.IndexOutOfBoundsException:0

时间:2016-08-25 13:46:59

标签: scala apache-spark

我有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。似乎tailhead无法按预期工作。如何解决这个问题?

  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)
               )
      })

1 个答案:

答案 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