我正在使用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))
这种行为可能是什么原因以及如何解决?
答案 0 :(得分:1)
正如对问题的评论所证实的,这里发生的事情是,大多数推文没有附加地理定位数据,使这些字段变空并导致不当行为。
对空值进行一些简单的检查可以解决问题。