在scala中访问DataSet的问题

时间:2015-12-07 08:11:38

标签: scala apache-spark cassandra

我实际上是尝试使用apache-spark,twitter API和cassandra来计算一个问题与Twitter上的响应之间的平均时间。

但是当我试图访问CassandraConnector返回的DataSet时,我只得到NullPointerException。

  def getTweets(inReplyToStatusId : Long, timestamp : DateTime ): String = {

  if(inReplyToStatusId > 0){
    CassandraConnector(TwitterStreamingApp.conf).withSessionDo { session =>
      val reply_id = session.execute("SELECT created_at FROM twitter_streaming.tweets WHERE tweet_id ="+ inReplyToStatusId+"ALLOW FILTERING")
      val reply_time_it = reply_id.all().get(0).getString("created_at")
      print(reply_time_it)
    }
  }
}

关于如何在scala中执行此操作的任何想法?这似乎很容易,但我在这方面苦苦挣扎!

谢谢

1 个答案:

答案 0 :(得分:1)

最可疑的行是

val reply_time_it = reply_id.all().get(0).getString("created_at")

由于cassandra记录中可能缺少任何非关键字段,因此很可能有时会null。你可以将它包装在像

这样的选项中
val reply_time_it = Option( reply_id.all().get(0).getString("created_at"))

然后你可以使用像getOrElse这样的方法来获取默认值,forEach来执行副作用方法(如果存在值),map来创建基于此值的新值。

你也应该:

  • 使用mapPartionsmapPartitionsWithIndex
  • 为每个分区创建一个会话
  • 为每个查询\ for performance reasons
  • 创建PreparedStatement