2017-04-11 14 views
0

CloudでETLプロセスを実装しました:ローカルデータベースでクエリを実行する=>結果をcsvとして保存し、クラウドストレージにロードする=>クラウドストレージからファイルをロードするBigQuery table =>次のクエリを使用して重複レコードを削除します。BigQuery - 時には重複するレコードを削除する

SELECT 
    * EXCEPT (row_number) 
FROM (
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp DESC) row_number 
    FROM rawData.stock_movement 
) 
WHERE row_number = 1 

今朝重複レコードを除去する工程がはるかに長く、それよりも通常かかります午前8時(ベルリンで現地時間)ので、でも、データの量が大きく異なることが通常よりもないんです。これは通常10秒かかります今日の午前中に重複したレコードを削除することがあります。

重複レコードを削除するとパフォーマンスが安定しませんか?

答えて

2

特定のidの値が重複している可能性があります。そのため、行番号の計算に時間がかかります。あなたはこれが事実であるかどうか、あなたが試みることができるかどうかを確認したい場合は、次の

#standardSQL 
SELECT id, COUNT(*) AS id_count 
FROM rawData.stock_movement 
GROUP BY id 
ORDER BY id_count DESC LIMIT 5; 

をということで、その代わりに、このクエリで重複を削除するために速くなることがあります。ここでは

#standardSQL 
SELECT latest_row.* 
FROM (
    SELECT ARRAY_AGG(t ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS latest_row 
    FROM rawData.stock_movement AS t 
    GROUP BY t.id 
); 

は一例です:これは高速であってもよいこと

#standardSQL 
WITH T AS (
    SELECT 1 AS id, 'foo' AS x, TIMESTAMP '2017-04-01' AS timestamp UNION ALL 
    SELECT 2, 'bar', TIMESTAMP '2017-04-02' UNION ALL 
    SELECT 1, 'baz', TIMESTAMP '2017-04-03') 
SELECT latest_row.* 
FROM (
    SELECT ARRAY_AGG(t ORDER BY timestamp DESC LIMIT 1)[OFFSET(0)] AS latest_row 
    FROM rawData.stock_movement AS t 
    GROUP BY t.id 
); 

理由は、BigQueryのが唯一の任意の時点でメモリ内の最大のタイムスタンプを持つ行を保つことです。

関連する問題