我正在使用Spark的Streaming API,我只想更好地理解如何最好地设计代码 .
我目前正在使用pyspark.streaming.kafka.createDirectStream中的Kafka Consumer(在pyspark中)
根据http://spark.apache.org/docs/latest/streaming-programming-guide.html
Spark Streaming提供称为离散流或DStream的高级抽象,表示连续的数据流 . DStream可以从来自Kafka,Flume和Kinesis等源的输入数据流创建,也可以通过在其他DStream上应用高级操作来创建 . 在内部,DStream表示为一系列RDD .
本质上,我想将一组函数应用于DStream中的每个元素 . 目前,我正在为pyspark.streaming.DStream使用"map"函数 . 根据文档,我的方法似乎是正确的 . http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html#pyspark.streaming.DStream
map(f,preservesPartitioning = False)通过将函数应用于DStream的每个元素来返回一个新的DStream .
我应该使用map,还是正确的方法是将函数/转换应用于RDD(因为DStream使用RDD)?
foreachRDD(func)将一个函数应用于此DStream中的每个RDD .
更多文档:http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html
1 回答
DirectStream.map
在这里是正确的选择 . 关于map
:相当于:
另一方面
DirectStream.foreachRDD
是一个输出动作并创建一个输出DStream
. 与foreachRDD
一起使用的函数不会返回任何内容,与方法本身相同 . 很明显,看看Scala签名: