如何使用Spark Dstreams进行简单的随机抽样?(使用spark 1.6.1进行pyspark)

时间:2016-08-18 20:13:42

标签: pyspark spark-streaming

我想从Dstream中的rdds中取样。由于Dstream没有sample()转换而且它是一系列rdds所以我这样做是为了从Dstream中取样并在其上应用一个wordcount:

from pyspark import SparkContext
from pyspark import SparkConf

# Optionally configure Spark Settings
conf=SparkConf()
conf.set("spark.executor.memory", "1g")
conf.set("spark.cores.max", "2")

conf.setAppName("SRS")
 sc = SparkContext('local[3]', conf=conf)

from pyspark.streaming import StreamingContext
streamContext = StreamingContext(sc,3)
lines = streamContext.socketTextStream("localhost", 9000)

def sampleWord(rdd):
     return rdd.sample(false,0.5,10)


lineSample = lines.foreachRDD(sampleWord)
words = lineSample.flatMap(lambda line: line.split(" "))
pairs = words.map(lambda word: (word , 1))
wordCount = pairs.reduceByKey(lambda x, y: x + y)
wordCount.pprint(60)


streamContext.start()
streamContext.stop()

使用此代码,Spark启动但没有发生任何事情。我不知道为什么rdd.sample()不能这样工作?使用foreachRDD,我们可以访问流中的每个rdd,所以我认为现在我们可以使用特定于rdd的转换。

2 个答案:

答案 0 :(得分:0)

使用transform

lineSample = lines.transform(sampleWord)

答案 1 :(得分:0)

使用transform代替foreachRDD。此外,您的代码中存在拼写错误。

def sampleWord(rdd):
 return rdd.sample(False,0.5,10) //False, not false

lineSample = lines.transform(sampleWord)
words = lineSample.flatMap(lambda line: line.split(" "))
pairs = words.map(lambda word: (word , 1))
wordCount = pairs.reduceByKey(lambda x, y: x + y)
wordCount.pprint(60)