如何在BigQuery中保留最新记录的状态?

时间:2016-07-18 23:30:57

标签: google-bigquery

我们在下游的数据管道中使用GCP。所有数据都导入BQ。 我们有销售Feed,我们每小时都会获得销售数据。订单生命周期中的订单状态在一天中发生变化(例如,订单状态从创建更改为已完成或付款已结算为否)这样我们最终获得同一订单的2-3条记录,我的目标是存储最新最好的秩序状态。订单号是唯一的号码。

我如何删除记录?

我在文档中看到了几页 - 这会有帮助吗? https://cloud.google.com/bigquery/streaming-data-into-bigquery#manually_removing_duplicates

2 个答案:

答案 0 :(得分:2)

WePay刚刚写了一篇关于做到这一点的文章。他们使用Airflow每15分钟自动化MySQL导出,然后使用一个BigQuery查询处理更新:

他们发布了此示例重复数据删除更新查询:

SELECT *
FROM (
    -- Assign an incrementing row number to every duplicate row, descending by the last modify time
    SELECT *, ROW_NUMBER() OVER (PARTITION BY [id] ORDER BY [modify_time] DESC) etl_row_num
    FROM
        -- Get the last month's worth of daily YYYYMMDD tables
        TABLE_DATE_RANGE([project-1234:cluster_db.table],
                         DATE_ADD(USEC_TO_TIMESTAMP(UTC_USEC_TO_MONTH(CURRENT_TIMESTAMP())),
                                                    -1,
                                                    'MONTH'),
                         CURRENT_TIMESTAMP()),
        -- Get all remaining monthly tables prior to a month
        TABLE_QUERY([project-1234:cluster_db.table],
                    "integer(regexp_extract(table_id, r'^table__monthly([0-9]+)'))
                    <
                    DATE_ADD(USEC_TO_TIMESTAMP(UTC_USEC_TO_MONTH(CURRENT_TIMESTAMP())), -1, 'MONTH')") )
-- Grab the most recent row, which will always have a row number equal to 1
WHERE etl_row_num = 1;

用他们的话说:

  

这个查询看起来很复杂,但它确实做得很漂亮   简单。它通过id字段(主键)对所有行进行分区。   然后根据modify_time对每个分区进行排序   行,降序(所以最近的更新是第一次)。然后呢   仅从每个分区(最近一行)中获取第一行。   这就是我们对所有表格进行重复数据删除的方法。

答案 1 :(得分:1)

  

这会有帮助吗?   https://cloud.google.com/bigquery/streaming-data-into-bigquery#manually_removing_duplicates

您在问题中引用的链接是为了在流式传输到表格时消除同一记录的重复插入。它与删除所有相关(相同顺序)但最新条目

的意义上的重复数据无关

在您的情况下,我会留下所有数据,只使用状态来过滤所需的记录。保留所有状态将使您能够进行更详细的分析,因为每个状态很可能具有一些特定的属性值,因此您不会丢失它们

如果不需要或因任何原因无法接受 - 您可以进行每日重复数据删除过程 - 如下所示

  

我如何删除记录?

SELECT * FROM (
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY Order_number ORDER BY timestamp DESC) as dup
  FROM YourTable
)
WHERE dup = 1