Google bigquery Python Apache Beam:BigQuery按行id进行流式重复数据消除
根据BigQuery文档,您可以通过提供Google bigquery Python Apache Beam:BigQuery按行id进行流式重复数据消除,google-bigquery,google-cloud-dataflow,apache-beam,Google Bigquery,Google Cloud Dataflow,Apache Beam,根据BigQuery文档,您可以通过提供插入ID()来确保数据的一致性。如果未提供,BQ将根据内部ID和最大努力确保一致性 通过使用bqapi,您可以使用行idparam()实现这一点,但对于apachebeampythonsdk,我找不到相同的方法 查看SDK时,我注意到存在一个“unique_row_id”属性,但我真的不知道如何将参数传递到WriteToBigQuery() 如何写入BQ(流式处理),为重复数据消除提供行Id?更新: 如果使用WriteToBigQuery,它将自动创建 为
插入ID
()来确保数据的一致性。如果未提供,BQ将根据内部ID和最大努力确保一致性
通过使用bqapi,您可以使用行id
param()实现这一点,但对于apachebeampythonsdk,我找不到相同的方法
查看SDK时,我注意到存在一个“unique_row_id”属性,但我真的不知道如何将参数传递到WriteToBigQuery()
如何写入BQ(流式处理),为重复数据消除提供行Id?更新:
如果使用WriteToBigQuery
,它将自动创建
为您插入一个名为insertId
的唯一行id,它将被插入到bigquery中。它是为您处理的,您不必担心它。:)
WriteToBigQuery
是一种p转换
,在它的expand
方法中调用BigQueryWriteFn
BigQueryWriteFn
是一个DoFn
,在它的过程中方法调用\u flush\u batch
\u flush\u batch
是一个调用BigQueryRapper.insert\u rows
方法的方法BigQueryWrspper.insert_rows
创建一个包含bigquery.TableDataInsertAllRequest.RowsValueListEntry
对象的列表,这些对象包含insertId
和作为json对象的行数据insertId
是通过调用unique\u row\u id
方法生成的,该方法返回一个由UUID4组成的值,UUID4与\u
连接并带有一个自动递增的数字bigQueryLink
至少,不是以它当前的形式,因为它不支持流媒体。我想这可能会改变
原始(非)答案 好问题,我也看了看,找不到确切的答案 Apache Beam似乎没有使用您链接到的google.cloud.bigquery客户端sdk,它有一些内部生成的api客户端,但它似乎是最新的 我查看了来源:
insertall
方法就在那里
我还发现了前面提到的insertid
因此,如果可以进行InsertAll调用,它将使用TableDataInsertAllRequest
并传递RowsValueListEntry
class TableDataInsertAllRequest(_messages.Message):
"""A TableDataInsertAllRequest object.
Messages:
RowsValueListEntry: A RowsValueListEntry object.
RowsValueListEntry
消息是插入ID的位置
这是用于“全部插入”的API文档
我将对此进行更多的研究,因为我没有看到WriteToBigQuery()
公开这一点
我怀疑“bigquery将至少记住这一点一分钟”对于重复数据消除来说是一个相当宽松的保证。如果您需要事务,文档建议使用数据存储。否则,您可能需要使用窗口函数运行SQL以在运行时执行重复数据消除,或者在bigquery上运行其他一些重复数据消除作业
也许使用WriteToBigQuery()
的batch\u size
参数,并在数据流中运行组合(或最坏的情况下是GroupByKey)步骤,是在写入之前更稳定的重复数据消除方法
class TableDataInsertAllRequest(_messages.Message):
"""A TableDataInsertAllRequest object.
Messages:
RowsValueListEntry: A RowsValueListEntry object.