var未初始化的对象数组

时间:2018-04-10 10:39:48

标签: arrays scala apache-spark cassandra nullpointerexception

我有以下代码: -

case class event(imei: String, date: String, gpsdt: String,  entrygpsdt: String,lastgpsdt: String)

object recalculate extends Serializable {
    def main(args: Array[String]) {
    val sc = SparkContext.getOrCreate(conf)
    val rdd = sc.cassandraTable("db", "table").select("imei", "date", "gpsdt").where("imei=? and date=? and gpsdt>? and gpsdt<?", entry(0), entry(1), entry(2), entry(3))
    var lastgpsdt = "2018-04-06 10:10:10"
    var updatedValues = new Array[event](rdd.count().toInt)
    var index = 0

    rdd.foreach(f => {
      val imei = f.get[String]("imei")
      val date = f.get[String]("date")
      val gpsdt = f.get[String]("gpsdt")
      updatedValues(index) = new event(imei, date, gpsdt,lastgpsdt)
      println(updatedValues(index).toString())
      index = index + 1
      lastgpsdt = gpsdt
    })
    println("updates values are " + updatedValues.toString())
}}

所以,在这里,我试图在每次迭代时在数组中创建一个事件类应答保存值的数组,并希望访问foreach块之外的数组。我的问题是,当我试图访问数组时,它会给出空指针异常,我检查它显示数组是空的。虽然我已经将数组声明为var仍然无法访问外部。建议,谢谢。

1 个答案:

答案 0 :(得分:1)

如果你想获得Array[event],那么我认为这不是正确的方法

以下是您可以为替代方案做的事情

case class event(imei: String, date: String, gpsdt: String,
                 entrygpsdt: String,lastgpsdt: String)

val result = rdd.map(row => {
  val imei = row.getString(0)
  val date = row.getString(1)
  val gpsdt = row.getString(2)
  //create case class as you want 
  event(imei, date, gpsdt, lastgpsdt ,"2018-04-06 10:10:10")
})
.collect()

您获得的结果是Array[event]

仅当您的数据量较小并且可以放入驱动程序时,

Collect也是首选。

希望这有帮助!