将GeoLocation Twitter4J写入Postgres

时间:2018-01-10 08:37:27

标签: postgresql scala geolocation twitter4j akka-stream

我正在使用Twitter4J和Akka Streams提取推文。我选择了一些字段,如userId,tweetId,tweet text等。这个Tweet实体被写入数据库:

class Counter extends StatusAdapter with Databases{
  implicit val system = ActorSystem("TweetsExtractor")
  implicit val materializer = ActorMaterializer()
  implicit val executionContext = system.dispatcher
  implicit val LoggingAdapter =
    Logging(system, classOf[Counter])

  val overflowStrategy = OverflowStrategy.backpressure
  val bufferSize = 1000
  val statusSource = Source.queue[Status](
    bufferSize,
    overflowStrategy
  )

  val insertFlow: Flow[Status, Tweet, NotUsed] =
    Flow[Status].map(status => Tweet(status.getId, status.getUser.getId, status.getText, status.getLang,
      status.getFavoriteCount, status.getRetweetCount))
  val insertSink: Sink[Tweet, Future[Done]] = Sink.foreach(tweetRepository.create)
  val insertGraph = statusSource via insertFlow to insertSink
  val queueInsert = insertGraph.run()

  override def onStatus(status: Status) = 
    Await.result(queueInsert.offer(status), Duration.Inf)
}

我的目的是添加位置字段。在Twitter4J中有一个特定的GeoLocation类型,它包含double类型的纬度和经度。但是,当我尝试直接通过流提取纬度和经度时,没有任何内容写入数据库:

Flow[Status].map(status => Tweet(status.getId, status.getUser.getId, status.getText, status.getLang, status.getFavoriteCount, status.getRetweetCount, status.getGeoLocation.getLatitude, status.getGeoLocation.getLongitude))

这种行为可能是什么原因以及如何解决?

1 个答案:

答案 0 :(得分:1)

正如对问题的评论所证实的,这里发生的事情是,大多数推文没有附加地理定位数据,使这些字段变空并导致不当行为。

对空值进行一些简单的检查可以解决问题。