教程建议:
>>> x = sc.parallelize([("a", 1), ("b", 4)])
>>> y = sc.parallelize([("a", 2)])
>>> sorted(x.cogroup(y).collect())
[('a', ([1], [2])), ('b', ([4], []))]
然而,在运行时,我得到以下输出:
('a', (<pyspark.resultiterable.ResultIterable object at 0x1d8b190>, <pyspark.resultiterable.ResultIterable object at 0x1d8b150>))
('b', (<pyspark.resultiterable.ResultIterable object at 0x1d8b210>, <pyspark.resultiterable.ResultIterable object at 0x1d8b1d0>))
这有3级嵌套,如果我将输出存储在'r'中并执行此操作:
for i in r:
for j in i[1]:
print list(j)
我得到了正确的编号:
1)为什么Cogroup不会在PySpark中返回像rightjoin / leftouterjoin等数字? 2)为什么我不能在PySpark shell上复制这个例子?
答案 0 :(得分:1)
简单回答,因为这是cogroup应该返回的内容
/**
* For each key k in `this` or `other`, return a resulting RDD that contains a tuple with the
* list of values for that key in `this` as well as `other`.
*/
def cogroup[W](other: RDD[(K, W)]): RDD[(K, (Iterable[V], Iterable[W]))]
连接spark实际上是用cogroup实现的,基本上连接只是将cogroup中的iterables分解为元组。这是从火花中植入的连接。
def join[W](other: RDD[(K, W)], partitioner: Partitioner): RDD[(K, (V, W))] = {
this.cogroup(other, partitioner).flatMapValues { case (vs, ws) =>
for (v <- vs; w <- ws) yield (v, w)
}
}
至于解释器输出的细微差别(请记住输出是相同的,除了pyspark Iterable没有显示它的内容),除非我看到教程,否则我无法确定。教程可能会显示输出更清晰,即使实际上并不是出现的。还有一件事我在scala shell中运行了一个类似的脚本,它显示了所有的输出。
Array((a,(ArrayBuffer(1),ArrayBuffer(2))), (b,(ArrayBuffer(4),ArrayBuffer())))