我使用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
答案 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