Spark Streaming DStream元素与RDD

时间:2016-02-29 18:01:52

标签: apache-spark pyspark apache-kafka spark-streaming

我使用Spark的Streaming API,我只是希望更好地了解如何最好地设计代码。

我目前正在使用来自pyspark.streaming.kafka.createDirectStream的Kafka Consumer(在pyspark中)

根据http://spark.apache.org/docs/latest/streaming-programming-guide.html

  

Spark Streaming提供了一种称为离散化的高级抽象   stream或DStream,表示连续的数据流。   可以从源的输入数据流创建DStream   如Kafka,Flume和Kinesis,或通过应用高级别   其他DStream上的操作。在内部,DStream表示为   一系列RDD。

基本上,我想将一组函数应用于DStream中的每个元素。目前,我正在使用"地图" pyspark.streaming.DStream的函数。根据文档,我的方法似乎是正确的。 http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html#pyspark.streaming.DStream

  

map(f,preservesPartitioning = False)通过应用a返回一个新的DStream   函数到DStream的每个元素。

我应该使用map,还是正确的方法是将函数/转换应用于RDD(因为DStream使用RDD)??

  

foreachRDD(func)将函数应用于此DStream中的每个RDD。

更多文档: http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html

1 个答案:

答案 0 :(得分:1)

DirectStream.map是正确的选择。关注map

stream.map(f)

相当于:

stream.transform(lambda rdd: rdd.map(f))
另一方面,

DirectStream.foreachRDD是输出操作并创建输出DStream。与foreachRDD一起使用的函数不会返回任何内容,与方法本身相同。很明显,看看Scala签名:

def foreachRDD(foreachFunc: RDD[T] => Unit): Unit