python - 关于在 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 管道的预期结构和流程的信息,管道中的单个阶段是否应该返回一个类似列表的对象?
解决方案
- beam.Map 和 beam.DoFn 的返回类型应该是一个列表吗?
- 不,这对于 .Map 是不正确的。如果您正在实施 ParDo,则 pardo 应输出列表。
- 告诉函数根本不返回任何东西?
- 您可以使用 .FlatMap() 并返回空列表。Map 适用于 1:1 转换。最终,.Map 在内部使用 .FlatMap。
推荐阅读
- android - Android Studio 无法访问 adb 来运行构建
- amazon-web-services - AWS Glue:我真的需要爬虫来获取新内容吗?
- php - PHPMailer 从后端工作,但 ajax 不会在前端返回成功消息
- django - 如何创建 BytesIO img 并传递给模板
- c# - 如何更改字符串中的单个字符
- r - 无法使用 Docker 为 R 设置 Splash
- python - 比较字符串到字符串在python中应该为真时给出假
- java - 空数组指针
- api - 请求反馈:使用多个端点的多步 API 身份验证
- python - 像 Python 一样在 Lua 中编码(ord 函数)