2017-10-12 51 views
0

J'essaie de diffuser des données Twitter en utilisant spark scala code.Je suis capable d'aller chercher des données et créer un dataframe et le voir.Mais en essayant d'extraire status.getPlace.getCountry() je reçois un java.lang.NullPointerException.Twitter streaming en utilisant Spark

version Spark: 2.0.0, la version Scala: 2.11.8

essayées avec si les conditions, vérifier la valeur etc, mais en vain.

code:

val spark = SparkSession.builder().appName("Twitter Spark Example").getOrCreate() 
val ssc = new StreamingContext(spark.sparkContext,Seconds(5)) 

val filters:Seq[String] = Seq("hadoop") 
val cb = new ConfigurationBuilder() 
     .setOAuthConsumerKey("******") 
     .setOAuthConsumerSecret("******") 
     .setOAuthAccessToken("********") 
     .setOAuthAccessTokenSecret("******").build() 

val twitter_auth = new TwitterFactory(cb) 
val a = new OAuthAuthorization(cb) 
val atwitter:Option[twitter4j.auth.Authorization] = Some(twitter_auth.getInstance(a).getAuthorization()) 

val tweetsdstream = TwitterUtils.createStream(ssc, atwitter, filters, StorageLevel.MEMORY_AND_DISK_SER_2) 
val data = tweetsdstream.map {status => 
     val places = status.getPlace 
     val id = status.getUser.getId 
     val date = status.getUser.getCreatedAt.toString() 
     val user = status.getUser.getName() 
     val place = places.getCountry() 

     (id,date,user,place) 
     } 
data.foreachRDD{rdd => 
     import spark.implicits._ 
     rdd.toDF("id","date","user","place").show() 
    } 

ssc.start() 
ssc.awaitTermination() 

est-il des restrictions sur l'accès aux informations de localisation de Twitter? Toutes les suggestions seraient utiles.

Merci

+3

En fait, la plupart du temps 'getPlace' et' getCountry' contient la valeur null, vous pouvez essayer d'utiliser geoLocation à la place –

Répondre

0

Vous pouvez utiliser Option pour traiter null s:

val data = tweetsdstream.map { 
    status => 
    val place = Option(status.getPlace).map(_.getCountry).orNull 
    val id = status.getUser.getId 
    val user = status.getUser.getName 
    val date = status.getUser.getCreatedAt.toString 
    (id, date, user, place) 
} 

De cette façon, vous serez en mesure de visualiser tous les tweets, peu importe si elles ont un pays ou non (et sera nul si le pays n'est pas défini).

Option est très utile pour gérer des données éventuellement manquantes, n'hésitez pas à l'utiliser pour d'autres champs éventuellement vides.

+0

, Votre solution a fonctionné pour moi.Merci beaucoup. –