Написать GeoLocation Twitter4J в Postgres
Я извлекаю твиты, используя 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, который содержит широту и долготу двойного типа. Однако, когда я пытаюсь извлечь широту и долготу непосредственно через поток, в базу данных ничего не записывается:
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 ответ
То, что происходит здесь, как подтверждается в комментариях к вопросу, заключается в том, что большинство твитов не содержат прикрепленных данных геолокации, что делает эти поля пустыми и приводит к неправильному поведению.
Пара простых проверок на пустые значения должна решить проблему.