您好,有人可以向我解释为什么mapPartitions
对这两个函数的反应不同? (我已经查看了这个this thread,我不认为我的问题来自于我创建它时我的iterable是TraversableOnce
。
L=range(10)
J=range(5,15)
K=range(8,18)
data=J+K+L
def function_1(iter_listoflist):
final_iterator=[]
for sublist in iter_listoflist:
final_iterator.append([x for x in sublist if x%9!=0])
return iter(final_iterator)
def function_2(iter_listoflist):
final_iterator=[]
listoflist=list(iter_listoflist)
for i in range(len(listoflist)):
for j in range(i+1,len(listoflist)):
sublist=listoflist[i]+listoflist[j]
final_iterator.append([x for x in sublist if x%9!=0])
pass
pass
return iter(final_iterator)
sc.parallelize(data,3).glom().mapPartitions(function_1).collect()
返回
时的内容sc.parallelize(data,3).glom().mapPartitions(function_2).collect()
返回一个空数组,我通过在结尾处返回一个列表来检查代码,它完成了我想要的操作。
感谢您的帮助
Philippe C
答案 0 :(得分:1)
实际上非常简单。 listoflist
的长度始终等于1.要理解为什么会出现这种情况,您必须考虑调用glom
时发生的事情。引用the docs它会返回:
通过合并每个分区中的所有元素创建的RDD 列表。
这意味着当你打电话时:
listoflist=list(iter_listoflist)
您将获得一个包含单个元素列表的列表,其中包含该分区中的所有元素。忽略所有细节:
(sc.parallelize(data, 3)
.glom()
.mapPartitionsWithIndex(lambda i, iter: [(i, list(iter))])
.collect())
## [(0, [[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]]),
## (1, [[8, 9, 10, 11, 12, 13, 14, 15, 16, 17]]),
## (2, [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])]
这意味着
range(len(listoflist))
包含一个等于0的元素。range(i+1,len(listoflist))
替换为空range(1, 1)
因此没有什么可做的,你得到一个空的迭代器。
另外,所有这些pass
语句以及iter
调用都已完全过时。