用Spark和Python编写flatMap函数



我正在尝试以列表理解的方式用python编写flatMap函数!

simpleRDD = sc.parallelize([2,3,4])
print(simpleRDD.map(lambda x:range(1, x)).collect())

输出是这样的:

[[1], [1, 2], [1, 2, 3]]

我已经写了这样的地图函数并且它有效,这是正确的方法吗?

def myRange(x):
return [x for x in range(1,x)]
def myMap(func, myList):
return [func(i) for i in myList]
print(myMap(myRange, [2, 3, 4]))

但是,如果我想编写flatMap并实现以下代码在Spark中生成的内容,它将不起作用。

print(simpleRDD.flatMap(lambda x:range(1, x)).collect())

输出为:

[1, 1, 2, 1, 2, 3]

这是我的尝试,不起作用。

def myRange(x):
return [x for x in range(1,x)]
def myFlatMap(func, myList):
return [*(func(i) for i in myList)]
print(myFlatMap(myRange , [2, 3, 4]))

编写flatMap的列表理解方法是使用嵌套的 for 循环

[j for i in myList for j in func(i)]
#      ^outer loop     ^inner loop

其中第一个循环是循环遍历myList的外部循环,第二个循环是内部循环,它通过func遍历生成的列表/迭代器,并将结果列表中的每个元素作为平展放置。

def myFlatMap(func, myList):
return [j for i in myList for j in func(i)]
myFlatMap(myRange, [2,3,4])
# [1, 1, 2, 1, 2, 3]

您可以使用 reduce:

flat_array = reduce((lambda arr1, arr2: arr1 + arr2), array_of_arrays)

最新更新