在Python中,与pySpark的flatMap相当的方法是什么?

3

我在寻找一个将列表数组展平的函数。首先,我使用Apache Spark中的flatMap函数在RDD系统上实现了我的解决方案,但我想在本地执行此操作。然而,我无法找到相对应的函数。

samples = filtered_tiles.flatMap(lambda tile: process_tile(tile, sample_size, grayscale))

在Python 3中,有没有什么解决方法?

数组格式为:

samples = [(slide_num, sample)]

亲切的问候

2
可能是重复的问题:如何将列表中的列表变成平面列表? - Matt Messersmith
不完全正确。那个答案只是将一个综合列表展平。我想应用map函数并展平结果。 - vftw
做这个。使用传递进去的lambda调用map,然后使用链接的答案展开,并将所有内容放入名为flatMap的函数中。调用map很简单:问题在于展开,但已经有解决方案了。 - Matt Messersmith
1个回答

4

Here's an example of PySpark's flatMap on an RDD:

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也只能完成一层“解嵌套”的操作。换句话说,如果你有一个三维列表,它只会将其压缩成一个二维列表。因此,我们也需要让我们的压平函数做到这一点。
正如评论中所暗示的那样,你只需要调用内置的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级数据时,可以通过某些集群管理器连接到集群中。

希望对您有所帮助。


你在这样做的时候是否使用了三个核心?当初始的parallelize([3,4,5])如此短暂时,我无法让Spark使用超过一个核心。我尝试添加第二个参数到parallelize,但没有成功,包括更改Spark设置等。 - Thomas Ahle
@ThomasAhle 你是在说在本地模式下运行Spark并让它调用多个核心吗?我对本地模式不是很熟悉,但当你处于集群模式时,引擎决定如何分配工作有点复杂。长话短说,我认为你不能“强制”它使用3个核心。你只能说“这里,拿这3个核心”。也许尝试使用更多的数据,它会更愿意消耗更多的资源。对于非常小的数据(如上所述),你可能会在多线程/并行处理方面受到性能影响。 - Matt Messersmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接