如何根据条件运行Apache Beam写入大型查询

时间:2018-10-18 06:56:32

标签: google-cloud-platform google-bigquery google-cloud-dataflow apache-beam

我正在尝试从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

提前谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用

beam.Filter(lambda_function)

beam.Map步骤之后,以过滤掉传递给 lambda_function 时返回False的元素。

答案 1 :(得分:1)

您可以根据条件使用Additional-outputs ParDo 函数中拆分 PCollection

不要忘记为 ParDo 函数.with_outputs()

提供输出标签

当将 PCollection 的元素写入特定输出时,请使用.TaggedOutput()

然后选择所需的 PCollection 并将其写入BigQuery。