等效于Python中的pySpark flatMap

时间:2018-11-27 23:29:06

标签: python python-3.x pyspark flatmap

我正在寻找一个将列表数组展平的函数。 首先,我在RDD系统上使用Apach Spark函数flatMap实现了我的解决方案,但是我想在本地完成。但是,我找不到

的等效项
samples = filtered_tiles.flatMap(lambda tile: process_tile(tile, sample_size, grayscale))

在Python 3中。有什么解决方法吗?

数组格式为:

samples = [(slide_num, sample)]

亲切的问候

1 个答案:

答案 0 :(得分:2)

以下是RDD上PySpark的flatMap的示例:

sc.parallelize([3,4,5]).flatMap(lambda x: range(1,x)).collect()

将会产生

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

与仅产生map(供比较)的[[1, 2], [1, 2, 3], [1, 2, 3, 4]]相反。

flatMap也仅执行一个级别的“嵌套”。换句话说,如果您有3D列表,则只会将其展平为2D列表。因此,我们也将使拼合器执行此操作。

正如注释中所提到的,您所要做的就是调用内置的map,创建展平函数并将它们链接在一起。方法如下:

def flatMap(f, li):
    mapped = map(f, li)
    flattened = flatten_single_dim(mapped)
    yield from flattened

def flatten_single_dim(mapped):
    for item in mapped:
        for subitem in item:
            yield subitem

以快速的健全性检查回到我们的示例:

res = flatMap(lambda x: range(1, x), [3,4,5])
print(list(res))

输出:

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

根据需要。您会flatMap(lambda tile: process_tile(tile, sample_size, grayscale), filtered_tiles)(鉴于filtered_tiles是可迭代的)。

P.S。附带说明,您可以在“本地”模式下运行Spark,只需在RDD上调用flatMap。对于在本地计算机上制作小东西的原型,它会很好地工作。然后,当您准备进行扩展并拥有需要提取的TB数据时,您可以使用某个集群管理器加入集群。

HTH。