Google Big Query 分区表去重问题与解决方法

在Google Big query 中,有一类表被称为分区表(Partitioned Table)。该类表适用于存储数据量特别庞大的状况,但是当这类表中的数据存在重复数据时,用传统的sql除重语句并不能用于这类表(Big Query会返回错误)。此文将分析两种分区表去重的情况并提供解决方法:

1.分区表存在Unique Identifier或主键:

此情况比较简单,可用普通sql语句解决,步骤如下:

        a.用传统ranking语句选出所有重复项(where ranking>1)的主键值

        b.再以a为子查询作用于主查询delete语句中的where ... in ...,重复项即可去除

2.分区表无Unique Identifier:

   该情况下,如果要用select distinct选出已除重的表格,再将此表格替换原表格,这个方法会出错的,因为这类语句不允许作用于分区表。所以此种情况要另谋他法,利用bq指令编写shell脚本是其中之一,具体算法如下:

        a.在shell 脚本中遍历分区的字段,如以日期分区的表,就以天为单位遍历

        b.利用每次遍历的日期作为partitioned date,作用于select distinct 语句中,即可获取当天的除重数据

        c.将每天的除重数据利用bq append指令(可参考https://cloud.google.com/bigquery/docs/managing-partitioned-table-data)插入到新创建的分区表里,但要注意此指令需指定新分区表的分区日期

        d.遍历执行完,用新的分区表替换旧分区表(含重复数据的分区表)

以上为个人经验和观点,欢迎各位高手交流或纠正。

你可能感兴趣的:(sql,数据库,google,cloud)