我在打印/保存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 .....
答案 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