我正在寻找一个将列表数组展平的函数。
首先,我在RDD系统上使用Apach Spark函数flatMap
实现了我的解决方案,但是我想在本地完成。但是,我找不到
samples = filtered_tiles.flatMap(lambda tile: process_tile(tile, sample_size, grayscale))
在Python 3中。有什么解决方法吗?
数组格式为:
samples = [(slide_num, sample)]
亲切的问候
答案 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。