【问题标题】:Dataflow: update BigQuery rows with python pipeline数据流:使用 python 管道更新 BigQuery 行
【发布时间】:2023-03-31 08:45:02
【问题描述】:

想象一个简单的 Google 数据流管道。在此管道中,您使用 apache beam 函数从 BQ 读取,并且根据返回的 pcollection 您必须更新这些行

Journeys = (p
                    | 'Read from BQ' >> beam.io.Read(
                    beam.io.BigQuerySource(query=query, dataset="dataset", use_standard_sql=True)))

Update = ( Journeys
                   | 'Updating Journey Table' >> beam.Map(UpdateBQ))

Write = (Journeys
                    | 'Write transform to BigQuery' >> WriteToBigQuery('table', TABLE_SCHEMA_CANONICAL))

这个管道的问题是,当你读取表(beam.Map)时,对返回的pcollection中的每一项都执行了UpdateBQ


对 BigQuery 表执行更新的更好方法是什么?

我想这可以在不使用 beam.Map 的情况下完成,并且只执行并一次更新所有输入 pcolletion 的进程。


额外

def UpdateBQ(input):
    from google.cloud import bigquery
    import uuid
    import time
    client = bigquery.Client()
    STD = "#standardSQL"
    QUERY = STD + "\n" + """UPDATE table SET Field= 'YYY' WHERE Field2='XXX'"""
    client.use_legacy_sql = False
    query_job = client.run_async_query(query=QUERY, job_name='temp-query-job_{}'.format(uuid.uuid4()))  # API request
    query_job.begin()
    <...>

可能的解决方案

with beam.Pipeline(options=options) as p:
    Journeys = (p
                | 'Read from BQ' >> beam.io.Read(
                beam.io.BigQuerySource(query=query, dataset="dataset", use_standard_sql=True))
                )

    Write = (Journeys
                | 'Write transform to BigQuery' >> WriteToBigQuery('table', TABLE_SCHEMA_CANONICAL))


UpdateBQ();

【问题讨论】:

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


    【解决方案1】:

    从 BQ 读取后,您是否正在使用光束管道进行任何进一步的转换?还是只是您在代码中显示的方式,即从 BQ 读取然后在 BQ 中触发更新命令?在这种情况下,您根本不需要光束。只需使用 BQ 查询来更新使用另一个表的表中的数据。 BQ best practices 建议避免一次插入/更新单行。

    【讨论】:

    • 从 BQ 读取后退出其他转换:WriteToBigQuery。因此,在执行此操作时,我想更新其他表。没有beam.Map如何在这个管道中完成“更新表”步骤?谢谢!
    • 从您的案例看来,BQ 中发生的所有转换、读、写操作。对于这种情况,您可能不需要光束,它可以更快地为您工作。只需从创建初始 Journeys 数据集的查询中创建一个表。然后使用同一个表提交两个异步作业以更新第二个表并将结果写入另一个表。也许我在这里遗漏了一些东西。但根据你提到的场景,使用数据流对我来说似乎有点过头了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多