首页 > 解决方案 > 关于在 Apache Beam for python 中过滤返回值和预期返回类型的问题

问题描述

我有两个关于使用 Apache Beam for Python (Google Cloud Dataflow) 开发 map-reduce 管道的问题。

首先,每当我执行任何类型beam.DoFn()beam.Map()功能时,都会发生这样的事情

def function(input):
  if not input > 0:
    return None
  else:
    return input*2

p = beam.Pipeline()

(p
 | 'read some input from a source'
 >> read_from_datastore(some_query)
 | 'perform an operation on the input'
 >> beam.Map(function)
 | 'filter out invalid values'
 >> beam.Filter(lambda x: x is not None)
)

在映射函数中处理了某种错误情况,我返回 None 而不是预期的映射值。然后我必须添加一个beam.Filter()步骤来删除所有None值,使其不进入管道的下一阶段。在具有许多不同阶段的管道中处理这最终会变得非常冗长和烦人。是否有某种方法可以告诉函数自动过滤任何None返回值?或者只是告诉函数根本不返回任何东西?

其次,返回类型是否beam.Map应该beam.DoFn是列表?似乎每当我接受一个值并返回一个值时,事情就会开始中断。我经常发现自己将单个返回值(如 int)封装在括号中以将其转换为列表,这样我的管道的下一个阶段就只接收那个单个 int。我一定遗漏了一些关于 map-reduce 管道的预期结构和流程的信息,管道中的单个阶段是否应该返回一个类似列表的对象?

标签: pythongoogle-cloud-dataflowapache-beam

解决方案


  • beam.Map 和 beam.DoFn 的返回类型应该是一个列表吗?
    • 不,这对于 .Map 是不正确的。如果您正在实施 ParDo,则 pardo 应输出列表。
  • 告诉函数根本不返回任何东西?

推荐阅读