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级数据时,可以通过某些集群管理器连接到集群中。
希望对您有所帮助。
map
,然后使用链接的答案展开,并将所有内容放入名为flatMap
的函数中。调用map
很简单:问题在于展开,但已经有解决方案了。 - Matt Messersmith