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')]

我使用的方法有点类似于火花爆炸变换。

希望对您有所帮助!!!