PySpark:对dict类型RDD的迭代

时间:2017-04-25 14:43:22

标签: python apache-spark pyspark rdd

我和我有一个dict类型的RDD:

>>> a.collect()
  

[{(1155718,105):14,(1155718,1887):2,(1155718,1930):12,   (1155718,927):6,(1155718,2783):8,(1155718,738):4,(1155718,   952):4,(1155718,1196):6,(1155718,997):4,(1155718,2904):38}]

只是为了检查:

>>> a.map(lambda x:type(x)).collect()
  

并[d输入'dict'>]

但是我无法使用map()迭代dict类型RDD。我试过了:

>>> a.map(lambda x:(k,v) for k,v in x.iteritems())

令我完全惊讶的是它会导致错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

我在这里错过了重要的一点。

编辑:代码是正确的,除非与生成器语法相关的小错误正确代码应该是:

a.map(lambda x:[(k,v) for k,v in x.iteritems()])

1 个答案:

答案 0 :(得分:1)

我试过了:

data = [{(1155718, 105): 14, (1155718, 1887): 2, (1155718, 1930): 12, (1155718, 927): 6, (1155718, 2783): 8, (1155718, 738): 4, 
         (1155718, 952): 4, (1155718, 1196): 6, (1155718, 997): 4, (1155718, 2904): 38}]

rdd = sc.parallelize(data) 
rdd.flatMap(lambda _: [(k,v) for (k,v) in _.items()]).collect()

得到了这个:

[((1155718, 105), 14),
 ((1155718, 738), 4),
 ((1155718, 2904), 38),
 ((1155718, 1887), 2),
 ((1155718, 1196), 6),
 ((1155718, 1930), 12),
 ((1155718, 927), 6),
 ((1155718, 2783), 8),
 ((1155718, 997), 4),
 ((1155718, 952), 4)]