嵌套的Cogrouped RDD打印:<pyspark.resultiterable.resultiterable object =“”at =“”... =“”>

时间:2015-07-21 07:08:46

标签: python apache-spark pyspark

我在打印/保存RDD时遇到一些问题。以下是示例代码:

users_prods_joined = users_grpd.cogroup(prods_grpd) 

users_prods_joined_flattened = users_prods_joined.map(
   lambda (k, mapped): "{0} {1}".format(k,str(mapped)))

users_prods_joined_flattened.saveAsTextFile('users_prods_joined_flattened')

o / p是:

cat users_prods_joined_flattened/part-00* | more
  

648018220 pyspark.resultiterable.ResultIterable object at 0x107cc5b50

     

100341214 pyspark.resultiterable.ResultIterable object at 0x107cc5b50

     

8429212 pyspark.resultiterable.ResultIterable object at 0x107cc5b50

...

我想知道如何获取实际值,而不是pyspark.resultiterable.ResultIterable object at 0x107cc5b50 .....

3 个答案:

答案 0 :(得分:2)

试试这个,

[(x, tuple(map(list, y))) for x, y in sorted(list(x.cogroup(y).collect()))]

示例:

>>> x = sc.parallelize([("foo", 1), ("bar", 4)])
>>> y = sc.parallelize([("foo", -1)])
>>> z = [(x, tuple(map(list, y))) for x, y in sorted(list(x.cogroup(y).collect()))]
>>> print(z)

你应该得到所需的输出......

答案 1 :(得分:0)

如果你看一下https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html的cogroup文档,你可以看到它返回RDD [(K,(Iterable [V],Iterable [W]))] Iterable [V]和Iterable [W]包含两个separete RDD的值。你必须通过调用它们上的列表(...)来迭代它们或将它们变成一个列表。

我认为这样的事情会起作用(注意:代码没有经过测试):

users_prods_joined.map(lambda (k, mapped): "{0} {1}".format(k,str(list(mapped[0]) + list(mapped[1])))) 

答案 2 :(得分:0)

如果您还不想使用collect()但仍希望扩展您的iteretables,可以使用Harsha的示例执行以下操作:

>>> x = sc.parallelize([("foo", 1), ("bar", 4)])
>>> y = sc.parallelize([("foo", -1)])
>>> grp = x.cogroup(y).mapValues(lambda val: [i for e in val for i in e])

有点难看,但在一行中你得到一个所有分组值的列表,而不是一个Iterable