我正在尝试从Google pubsub和Google存储中读取值,并根据计数条件将这些值放入大型查询中,即,如果值存在,则不应插入该值,否则可以插入一个值。
我的代码如下:
p_bq = beam.Pipeline(options=pipeline_options1)
logging.info('Start')
"""Pipeline starts. Create creates a PCollection from what we read from Cloud storage"""
test = p_bq | beam.Create(data)
"""The pipeline then reads from pub sub and then combines the pub sub with the cloud storage data"""
BQ_data1 = p_bq | 'readFromPubSub' >> beam.io.ReadFromPubSub(
'mytopic') | beam.Map(parse_pubsub, param=AsList(test))
其中“数据”是Google存储的值,而从pubsub读取的值是Google Analytics(分析)的值。 Parse_pubsub返回2个值:一个是字典,另一个是count(表示表中存在或不存在该值)
count=comparebigquery(insert_record)
return (insert_record,count)
由于值在Pcollection中,因此如何为大查询插入提供条件
新修改:
class Process(beam.DoFn):
def process1(self, element, trans):
if element['id'] in trans:
# Emit this short word to the main output.
yield pvalue.TaggedOutput('present',element)
else:
# Emit this word's long length to the 'above_cutoff_lengths' output.
yield pvalue.TaggedOutput(
'absent', present)
test1 = p_bq | "TransProcess" >> beam.Create(trans)
其中trans是列表
BQ_data2 = BQ_data1 | beam.ParDo(Process(),trans=AsList(test1)).with_outputs('present','absent')
present_value=BQ_data2.present
absent_value=BQ_data2.absent
提前谢谢
答案 0 :(得分:2)
您可以使用
beam.Filter(lambda_function)
beam.Map步骤之后,以过滤掉传递给 lambda_function 时返回False的元素。
答案 1 :(得分:1)
您可以根据条件使用Additional-outputs在 ParDo 函数中拆分 PCollection 。
不要忘记为 ParDo 函数.with_outputs()
当将 PCollection 的元素写入特定输出时,请使用.TaggedOutput()
然后选择所需的 PCollection 并将其写入BigQuery。