我想了解在哪种情况下我应该使用FlatMap或Map。 The documentation我似乎并不清楚。
我仍然不明白在哪种情况下我应该使用FlatMap或Map的转换。
有人可以给我一个例子,以便了解他们的不同之处吗?
我理解Spark中FlatMap与Map的区别,但不确定是否有相似之处?
答案 0 :(得分:51)
Beam中的这些变换与Spark(Scala也是如此)完全相同。
Map
转换,将从N个元素的PCollection
映射到N个元素的另一个PCollection
。
FlatMap
转换将N个元素中的PCollections
映射到零个或多个元素的N个集合中,然后将展平成为单个PCollection
。< / p>
举个简单的例子,发生以下情况:
beam.Create([1, 2, 3]) | beam.Map(lambda x: [x, 'any'])
# The result is a collection of THREE lists: [[1, 'any'], [2, 'any'], [3, 'any']]
鉴于:
beam.Create([1, 2, 3]) | beam.FlatMap(lambda x: [x, 'any'])
# The lists that are output by the lambda, are then flattened into a
# collection of SIX single elements: [1, 'any', 2, 'any', 3, 'any']
答案 1 :(得分:1)
让我给你看一个例子
import apache_beam as beam
def categorize_explode(text):
result = text.split(':')
category = result[0]
elements = result[1].split(',')
return list(map(lambda x: (category, x), elements))
with beam.Pipeline() as pipeline:
things = (
pipeline
| 'Categories and Elements' >> beam.Create(["Vehicles:Car,Jeep,Truck,BUS,AIRPLANE","FOOD:Burger,SANDWICH,ICECREAM,APPLE"])
| 'Explode' >> beam.FlatMap(categorize_explode)
| beam.Map(print)
)
您可以看到categorize_explode
函数将字符串分成类别和相应的元素,并返回迭代器,如[('Vehicles','Car'),('Vehicles','Jeep'),...]
FlatMap接受此迭代器中的每个元素,并将每个元素视为PCollection中的单独元素。
因此结果将是:
('Vehicles', 'Car')
('Vehicles', 'Jeep')
('Vehicles', 'Truck')
('Vehicles', 'BUS')
('Vehicles', 'AIRPLANE')
('FOOD', 'Burger')
('FOOD', 'SANDWICH')
('FOOD', 'ICECREAM')
('FOOD', 'APPLE')
虽然Map执行一对一映射。即此迭代器[('Vehicles','Car'),('Vehicles','Jeep'),...]
将按原样返回。
因此,结果将针对Map:
[('Vehicles', 'Car'), ('Vehicles', 'Jeep'), ('Vehicles', 'Truck'), ('Vehicles', 'BUS'), ('Vehicles', 'AIRPLANE')]
[('FOOD', 'Burger'), ('FOOD', 'SANDWICH'), ('FOOD', 'ICECREAM'), ('FOOD', 'APPLE')]
我使用的方法有点类似于火花爆炸变换。
希望这会有所帮助!
答案 2 :(得分:0)
简单地说,
映射转换是列表/集合的每个元素上的“一对一”映射。例如-
{"Amar", "Akabar", "Anthony"} -> {"Mr.Amar", "Mr.Akabar", "Mr.Anthony"}
FlatMap转换通常在“列表列表”之类的集合上,并且此集合被展平为单个列表,并且转换/映射应用于“列表列表” /集合的每个元素。
FlatMap转换Ex-
{ {"Amar", "Akabar"}, "Anthony"} -> {"Mr.Amar", "Mr.Akabar", "Mr.Anthony"}
这个概念在整个编程语言和整个平台上都是相同的。
希望有帮助。