如何使用变换操作和外部RDD过滤dstream?

时间:2015-06-17 04:18:39

标签: apache-spark spark-streaming pyspark

我在Transformations on DStreams转换操作部分中描述的类似用例中使用了transform方法:

spamInfoRDD = sc.pickleFile(...) # RDD containing spam information
# join data stream with spam information to do data cleaning
cleanedDStream = wordCounts.transform(lambda rdd: rdd.join(spamInfoRDD).filter(...))

我的代码如下:

sc = SparkContext("local[4]", "myapp")
ssc = StreamingContext(sc, 5)
ssc.checkpoint('hdfs://localhost:9000/user/spark/checkpoint/')
lines = ssc.socketTextStream("localhost", 9999)
counts = lines.flatMap(lambda line: line.split(" "))\
              .map(lambda word: (word, 1))\
              .reduceByKey(lambda a, b: a+b)
filter_rdd = sc.parallelize([(u'A', 1), (u'B', 1)], 2)
filtered_count = counts.transform(
    lambda rdd: rdd.join(filter_rdd).filter(lambda k, (v1, v2): v1 and not v2)
)
filtered_count.pprint()
ssc.start()
ssc.awaitTermination()

但是我收到以下错误

  

您似乎正在尝试广播RDD或从动作或转换中引用RDD。   RDD转换和操作只能由驱动程序调用,而不能在其他转换内部调用;例如,rdd1.map(lambda x:rdd2.values.count()* x)无效,因为无法在rdd1.map转换内执行值转换和计数操作。有关更多信息,请参阅SPARK-5063。

我应该如何使用外部RDD过滤掉dstream中的元素?

1 个答案:

答案 0 :(得分:3)

Spark doc示例与您的代码之间的区别在于使用了ssc.checkpoint()。

虽然您提供的特定代码示例可以在没有检查点的情况下工作,但我猜您确实需要它。但是将外部RDD引入检查点DStream范围的概念可能是无效的:从检查点恢复时,外部RDD可能已经发生变化。

我试图检查外部RDD,但我也没有运气。