Google cloud dataflow 使用云数据流和pubsub的条件写入

Google cloud dataflow 使用云数据流和pubsub的条件写入,google-cloud-dataflow,apache-beam,google-cloud-pubsub,Google Cloud Dataflow,Apache Beam,Google Cloud Pubsub,我正在尝试使用CloudDataflow的Python API编写一个简单的程序,该程序接受pubsub发布者的输入,检查输入的条件,然后将数据输出到主题。我已经将程序编写到它接受和转换输入的地方,以及将数据发布到主题的地方。我的问题是,如果条件为真,我只想发布到主题。例如,如果json数据中存在一个关键字,那么我想向pubsub主题发布一条消息,但不想在关键字不存在时发布消息。我尝试添加一个全局布尔标志,当找到关键字时该标志变为true,并将其环绕在以下几行: output = (lines

我正在尝试使用CloudDataflow的Python API编写一个简单的程序,该程序接受pubsub发布者的输入,检查输入的条件,然后将数据输出到主题。我已经将程序编写到它接受和转换输入的地方,以及将数据发布到主题的地方。我的问题是,如果条件为真,我只想发布到主题。例如,如果json数据中存在一个关键字,那么我想向pubsub主题发布一条消息,但不想在关键字不存在时发布消息。我尝试添加一个全局布尔标志,当找到关键字时该标志变为true,并将其环绕在以下几行:

output = (lines
          | 'format' >> beam.Map(format_result)
          | 'encode' >> beam.Map(lambda x: x.encode('utf-8')).with_output_types(six.binary_type))
output | beam.io.WriteStringsToPubSub(self.output_topic)

那是行不通的。我的想法也快用完了。有人知道这是否可以做到吗?

您可以使用ParDo,该ParDo仅在满足条件时才能生成元素。例如,考虑下面的消息结构,其中<代码>发布>代码>字段指示处理的消息是否应该由PARDO输出:

{"publish":"true","body":"This message should be published"}
{"publish":"false","body":"This message should *NOT* be published"}
只有当
publish
设置为
true
时,我们才会生成值:

类过滤器fn(beam.DoFn):
def流程(自身、要素):
如果(元素['publish']='true'):
屈服元素['body']
以及主管道代码:

lines=p |“读取消息”>>beam.io.ReadStringsFromPubSub(主题=已知参数输入)
jsons=lines |'加载到JSON'>>beam.Map(lambda x:JSON.loads(x))
filtered=jsons |“Filter messages”>>beam.ParDo(FilterFn())
过滤的|“发布消息”>>beam.io.WriteStringsToPubSub(主题=已知参数输出)
从输出订阅中提取消息将只返回一条消息:

应发布此消息