Google cloud dataflow Apache Beam:FlatMap vs Map?

Google cloud dataflow Apache Beam:FlatMap vs Map?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我想了解在哪种情况下应该使用FlatMap或Map。我似乎不清楚 我仍然不明白在哪种情况下应该使用FlatMap或Map的转换 有人能给我举个例子,让我了解他们的区别吗 我理解FlatMap与Spark中Map的区别,但不确定是否有相似之处 Beam中的这些变换与Spark(Scala)完全相同 一个Map变换,将N个元素的PCollection映射到另一个PCollection FlatMap变换将N个元素的PCollection映射为N个零个或多个元素的集合,然后将这些集合展平为单个PCol

我想了解在哪种情况下应该使用FlatMap或Map。我似乎不清楚

我仍然不明白在哪种情况下应该使用FlatMap或Map的转换

有人能给我举个例子,让我了解他们的区别吗

我理解FlatMap与Spark中Map的区别,但不确定是否有相似之处

Beam中的这些变换与Spark(Scala)完全相同

一个
Map
变换,将N个元素的
PCollection
映射到另一个
PCollection

FlatMap
变换将N个元素的
PCollection
映射为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']
简言之

映射转换是列表/集合的每个元素上的“一对一”映射。前-

{"Amar", "Akabar", "Anthony"} -> {"Mr.Amar", "Mr.Akabar", "Mr.Anthony"}
FlatMap转换通常在类似“列表列表”的集合上进行,该集合被展平为单个列表,转换/映射应用于“列表列表”/集合的每个元素

平面映射变换-

{ {"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\u 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执行一对一映射。i、 e.此迭代器
[('Vehicles','Car'),('Vehicles','Jeep'),…]将按原样返回

因此,Map的结果是:

[('Vehicles', 'Car'), ('Vehicles', 'Jeep'), ('Vehicles', 'Truck'), ('Vehicles', 'BUS'), ('Vehicles', 'AIRPLANE')]
[('FOOD', 'Burger'), ('FOOD', 'SANDWICH'), ('FOOD', 'ICECREAM'), ('FOOD', 'APPLE')]
我使用的方法有点类似于spark explode变换


希望这有帮助

巴勃罗-明白了。感谢您的详细解释和示例。:)出色的解释+1轻微的澄清:与
PCollection
一样,顺序是任意的-因此它可以是[1,2,3,'any','any','any']。另外,正如您所期望的,
FlatMap
要求传递给它的函数返回一个列表;也就是说,
beam.Create([1,2,3])| beam.FlatMap(lambda x:x)
将引发一个异常。这个基本的东西(以及更多的东西)在任何地方都没有明确的文档记录,这一事实说明了这个项目及其对python的支持。可用的文档是一场噩梦。。。我很少遇到如此糟糕的文档。