Spark Streaming:将Dstream批处理加入单个输出文件夹

时间:2015-05-14 12:51:39

标签: hadoop apache-spark spark-streaming apache-spark-sql twitter-streaming-api

我正在使用Spark Streaming通过创建StreamingContext从Twitter获取推文:
val ssc = new StreamingContext("local[3]", "TwitterFeed",Minutes(1))

并创建twitter流为:
val tweetStream = TwitterUtils.createStream(ssc, Some(new OAuthAuthorization(Util.config)),filters)

然后将其保存为文本文件
tweets.repartition(1).saveAsTextFiles("/tmp/spark_testing/")

问题在于推文是基于批处理时间保存为文件夹的,但是我需要在同一个文件夹中将每个批次的所有数据保存。

有没有解决方法呢?

由于

1 个答案:

答案 0 :(得分:0)

我们可以使用Spark SQL的新DataFrame保存API来执行此操作,该API允许附加到现有输出。默认情况下,saveAsTextFile将无法保存到包含现有数据的目录(请参阅https://spark.apache.org/docs/latest/sql-programming-guide.html#save-modes)。 https://spark.apache.org/docs/latest/streaming-programming-guide.html#dataframe-and-sql-operations介绍了如何设置Spark SQL上下文以与Spark Streaming一起使用。

假设您使用SQLContextSingleton从指南中复制部件,结果代码如下所示:

data.foreachRDD{rdd =>
  val sqlContext = SQLContextSingleton.getInstance(rdd.sparkContext)
  // Convert your data to a DataFrame, depends on the structure of your data
  val df = ....
  df.save("org.apache.spark.sql.json", SaveMode.Append, Map("path" -> path.toString))
}

(注意上面的例子使用JSON来保存结果,但你也可以使用不同的输出格式。)