PySpark中mapPartitions返回的空数组

时间:2015-11-05 13:08:06

标签: python apache-spark pyspark partition

您好,有人可以向我解释为什么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

1 个答案:

答案 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调用都已完全过时。