我尝试使用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")
答案 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
的解决方案将地图转换为数据框