Spark-Scala:保存为csv文件(RDD)

时间:2017-10-07 04:15:39

标签: scala csv apache-spark

我尝试使用Apache Spark流式传输Twitter数据,我想将流数据保存为csv文件,但我不能 如何修复我的代码才能在csv

中获取它

我使用RDD。

这是我的主要代码:

val ssc = new StreamingContext(conf, Seconds(3600))
val stream = TwitterUtils.createStream(ssc, None, filters)

val tweets = stream.map(t => {
  Map(
    // This is for tweet
    "text" -> t.getText,
    "retweet_count" -> t.getRetweetCount,
    "favorited" -> t.isFavorited,
    "truncated" -> t.isTruncated,
    "id_str" -> t.getId,
    "in_reply_to_screen_name" -> t.getInReplyToScreenName,
    "source" -> t.getSource,
    "retweeted" -> t.isRetweetedByMe,
    "created_at" -> t.getCreatedAt,
    "in_reply_to_status_id_str" -> t.getInReplyToStatusId,
    "in_reply_to_user_id_str" -> t.getInReplyToUserId,

    // This is for tweet's user
    "listed_count" -> t.getUser.getListedCount,
    "verified" -> t.getUser.isVerified,
    "location" -> t.getUser.getLocation,
    "user_id_str" -> t.getUser.getId,
    "description" -> t.getUser.getDescription,
    "geo_enabled" -> t.getUser.isGeoEnabled,
    "user_created_at" -> t.getUser.getCreatedAt,
    "statuses_count" -> t.getUser.getStatusesCount,
    "followers_count" -> t.getUser.getFollowersCount,
    "favorites_count" -> t.getUser.getFavouritesCount,
    "protected" -> t.getUser.isProtected,
    "user_url" -> t.getUser.getURL,
    "name" -> t.getUser.getName,
    "time_zone" -> t.getUser.getTimeZone,
    "user_lang" -> t.getUser.getLang,
    "utc_offset" -> t.getUser.getUtcOffset,
    "friends_count" -> t.getUser.getFriendsCount,
    "screen_name" -> t.getUser.getScreenName
  )
})

tweets.repartition(1).saveAsTextFiles("~/streaming/tweets")

1 个答案:

答案 0 :(得分:2)

您需要将RDD [Map [String,String]]的推文转换为数据帧以保存为CSV。原因很简单,RDD没有架构。而csv格式具有特定的架构。因此,您必须将RDD转换为具有架构的数据帧。

有几种方法可以做到这一点。一种方法可能是使用案例类而不是将数据放入映射中。

 case class(text:String, retweetCount:Int ...)

现在使用适当的参数来实例化案例类而不是Map(...)。

最后使用spark隐式转换将推文转换为数据帧

import spark.implicits._
tweets.toDF.write.csv(...) // saves as CSV

或者,您可以使用给定here

的解决方案将地图转换为数据框