相当于 Python 中的 pySpark flatMap

Equivalent to pySpark flatMap in Python

我正在寻找一个函数来展平列表数组。 首先,我在 RDD 系统上使用 Apach Spark 函数 flatMap 实现了我的解决方案,但我想在本地执行此操作。但是,我无法找到

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

in Python 3. 有什么解决方法吗?

数组格式为:

samples = [(slide_num, sample)]

亲切的问候

这是 PySpark 在 RDD 上的 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也只做了"unnesting"的一级。换句话说,如果你有一个 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。作为旁注,您可以在 "local" 模式下 运行 Spark,并且只需在 RDD 上调用 flatMap。它适用于在本地机器上制作小东西的原型。然后,当您准备好扩展并有 TB 的数据需要撕裂时,您可以使用一些集群管理器连接到集群。

HTH.