Dstream上的Pyspark过滤器操作

时间:2017-02-10 05:40:41

标签: pyspark dstream

我一直在尝试扩展网络字数,以便能够根据特定关键字过滤行

我正在使用spark 1.6.2

from __future__ import print_function

import sys

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: network_wordcount.py <hostname> <port>", file=sys.stderr)
        exit(-1)
    sc = SparkContext(appName="PythonStreamingNetworkWordCount")
    ssc = StreamingContext(sc, 5)

    lines = ssc.socketTextStream(sys.argv[1], int(sys.argv[2]))
    counts = lines.flatMap(lambda line: line.split(" ")).filter("ERROR")
    counts.pprint()

    ssc.start()
    ssc.awaitTermination()

我尝试了所有变体,

  

我几乎总是得到错误,我不能应用像

这样的功能      

pprint / show / take / collect on TransformedDStream

。我使用forestreamRDD在Dstream行上进行转换,并使用本机python字符串方法进行检查,但也失败了(实际上,如果我在程序中的任何地方使用print,那么spark-submit就会出现 - 没有报告错误。

我想要的是能够在&#34; ERROR&#34;等关键字上过滤传入的Dstream。 | &#34;警告&#34;等,并将其输出到stdout或stderr。

1 个答案:

答案 0 :(得分:3)

  

我想要的是能够在&#34; ERROR&#34;等关键字上过滤传入的Dstream。 | &#34;警告&#34;等,并将其输出到stdout或stderr。

然后,您不想拨打flatMap,因为这会将您的线路分成单独的令牌。相反,您可以通过调用filter来替换该调用,该调用会检查该行是否包含"error"

lines = ssc.socketTextStream(sys.argv[1], int(sys.argv[2]))
errors = lines.filter(lambda l: "error" in l.lower())
errors.pprint()