Apache Beam:平面地图与地图?
Apache Beam : FlatMap vs Map?
我想了解在什么场景下应该使用FlatMap还是Map。 The documentation 我好像不太清楚。
我还是不明白应该在什么场景下使用FlatMap或者Map的转换
谁能举个例子让我明白他们的区别?
我了解 Spark 中 FlatMap 与 Map 的区别,但不确定是否有相似之处?
These transforms in Beam are exactly same as Spark (Scala too).
A Map
变换,映射 从一个 PCollection
个 N 元素到另一个 PCollection
个 N 元素。
A FlatMap
变换将 N 个元素的 PCollections
映射为零个或多个元素的 N 个集合,然后将其 展平 为单个 PCollection
.
举个简单的例子,会发生以下情况:
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']
用最简单的话来说,
映射变换是list/collection的每个元素上的“一对一”映射。例如-
{"Amar", "Akabar", "Anthony"} -> {"Mr.Amar", "Mr.Akabar", "Mr.Anthony"}
FlatMap 转换通常在“列表的列表”之类的集合上进行,并且此集合被扁平化为单个列表,transformation/mapping 应用于“列表的列表”/集合的每个元素。
FlatMap变换Ex -
{ {"Amar", "Akabar"}, "Anthony"} -> {"Mr.Amar", "Mr.Akabar", "Mr.Anthony"}
这个概念在所有编程语言和平台上都是一样的。
希望对您有所帮助。
举个例子
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
函数将字符串拆分为类别和相应的元素以及 returns 迭代器,如 [('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'),...]
将按原样返回。
所以地图的结果是:
[('Vehicles', 'Car'), ('Vehicles', 'Jeep'), ('Vehicles', 'Truck'), ('Vehicles', 'BUS'), ('Vehicles', 'AIRPLANE')]
[('FOOD', 'Burger'), ('FOOD', 'SANDWICH'), ('FOOD', 'ICECREAM'), ('FOOD', 'APPLE')]
我使用的方法有点类似于火花爆炸变换。
希望对您有所帮助!!!
我想了解在什么场景下应该使用FlatMap还是Map。 The documentation 我好像不太清楚。
我还是不明白应该在什么场景下使用FlatMap或者Map的转换
谁能举个例子让我明白他们的区别?
我了解 Spark 中 FlatMap 与 Map 的区别,但不确定是否有相似之处?
These transforms in Beam are exactly same as Spark (Scala too).
A Map
变换,映射 从一个 PCollection
个 N 元素到另一个 PCollection
个 N 元素。
A FlatMap
变换将 N 个元素的 PCollections
映射为零个或多个元素的 N 个集合,然后将其 展平 为单个 PCollection
.
举个简单的例子,会发生以下情况:
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']
用最简单的话来说,
映射变换是list/collection的每个元素上的“一对一”映射。例如-
{"Amar", "Akabar", "Anthony"} -> {"Mr.Amar", "Mr.Akabar", "Mr.Anthony"}
FlatMap 转换通常在“列表的列表”之类的集合上进行,并且此集合被扁平化为单个列表,transformation/mapping 应用于“列表的列表”/集合的每个元素。
FlatMap变换Ex -
{ {"Amar", "Akabar"}, "Anthony"} -> {"Mr.Amar", "Mr.Akabar", "Mr.Anthony"}
这个概念在所有编程语言和平台上都是一样的。
希望对您有所帮助。
举个例子
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
函数将字符串拆分为类别和相应的元素以及 returns 迭代器,如 [('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'),...]
将按原样返回。
所以地图的结果是:
[('Vehicles', 'Car'), ('Vehicles', 'Jeep'), ('Vehicles', 'Truck'), ('Vehicles', 'BUS'), ('Vehicles', 'AIRPLANE')]
[('FOOD', 'Burger'), ('FOOD', 'SANDWICH'), ('FOOD', 'ICECREAM'), ('FOOD', 'APPLE')]
我使用的方法有点类似于火花爆炸变换。
希望对您有所帮助!!!