Python 在'上调用Distinct;pyspark.resultiterable.resultiterable';

Python 在'上调用Distinct;pyspark.resultiterable.resultiterable';,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在写一些spark代码,我有一个RDD [(4, <pyspark.resultiterable.ResultIterable at 0x9d32a4c>), (1, <pyspark.resultiterable.ResultIterable at 0x9d32cac>), (5, <pyspark.resultiterable.ResultIterable at 0x9d32bac>), (2, <pyspark.resultiter

我正在写一些spark代码,我有一个RDD

[(4, <pyspark.resultiterable.ResultIterable at 0x9d32a4c>), 
 (1, <pyspark.resultiterable.ResultIterable at 0x9d32cac>), 
 (5, <pyspark.resultiterable.ResultIterable at 0x9d32bac>), 
 (2, <pyspark.resultiterable.ResultIterable at 0x9d32acc>)] 
但我有一个错误:

异常:您似乎正在尝试引用 从广播变量、操作或转换中生成SparkContext。 SparkContext只能在驱动程序上使用,不能在其运行的代码中使用 关于工人。有关更多信息,请参阅SPARK-5063


错误是不言自明的,我不能使用sc。但我需要找到一种方法将
pyspark.resultiterable
resultiterable
覆盖到RDD,以便我可以调用distinct。简单的方法是使用集合:

from numpy.random import choice, seed
seed(323)

keys = (4, 1, 5, 2)
hosts = [
    u'in24.inetnebr.com',
    u'ix-esc-ca2-07.ix.netcom.com',
    u'uplherc.upl.com',
    u'slppp6.intermind.net',
    u'piweba4y.prodigy.com'
]

pairs = sc.parallelize(zip(choice(keys, 20), choice(hosts, 20))).groupByKey()
pairs.map(lambda (k, v): (k, set(v))).take(3)
结果:

[(1, {u'ix-esc-ca2-07.ix.netcom.com', u'slppp6.intermind.net'}),
 (2,
  {u'in24.inetnebr.com',
   u'ix-esc-ca2-07.ix.netcom.com',
   u'slppp6.intermind.net',
   u'uplherc.upl.com'}),
 (4, {u'in24.inetnebr.com', u'piweba4y.prodigy.com', u'uplherc.upl.com'})]
如果使用
rdd.disect
有特殊原因,您可以尝试以下方法:

def distinctHost(pairs, key):
    return (pairs
        .filter(lambda (k, v): k == key)
        .flatMap(lambda (k, v): v)
        .distinct())

[(key, distinctHost(pairs, key).collect()) for key in pairs.keys().collect()]
def distinctHost(pairs, key):
    return (pairs
        .filter(lambda (k, v): k == key)
        .flatMap(lambda (k, v): v)
        .distinct())

[(key, distinctHost(pairs, key).collect()) for key in pairs.keys().collect()]