2012-09-10 35 views
7

BigQueryテーブルに毎日インクリメンタルデータを追加する予定です。インクリメンタルデータを既存のテーブルに追加するたびに、テーブル内の既存のデータから重複レコード(プライマリキーカラムに基づいて)を削除したいと考えています。 SELECT all_cols from table where pkey_col NOT IN (INCR_KEYS) - - と新しいテーブルに結果を格納する行にクエリを実行し BigQueryテーブルの重複レコードを削除する

  • INCR_KEYSそれを呼び出すことができます)増分データからキーのセットを収集し

    1. - 一つのアプローチは、になります。
    2. 新しいテーブルにインクリメンタルデータを追加します。

    私はこのアプローチで懸念しているのは、大きなテーブルの重複コピーを作成し、請求書に追加することです。

    重複テーブルを作成せずに同じことを達成するより良い方法はありますか?

  • +0

    テーブルがどれくらい大きいですか?圧縮された64MBを超える場合、#2は失敗します。 –

    +0

    @ RyanBoyd - それは問題ではありません。 INCR_KEYS> 64MBの場合、INCR_KEYSを小さなチャンクに分割して繰り返します。<2> – user1659408

    +0

    問題は、フルテーブル(つまり、INCR_KEYSにないデータ)が> 64MBの場合です。 #2のSELECTクエリは成功しません。 –

    答えて

    4

    重複したテーブルを作成せずにこれを行う方法はわかりません。これは実際には非常に巧妙な解決策のようです。

    ただし、追加費用はごくわずかです.BigQueryは、それが存在する期間だけデータを請求します。古いテーブルを削除する場合は、秒または分の期間だけ両方のテーブルの支払いが必要です。

    +0

    ありがとう@ジョーダン、私はそれと一緒に暮らすことができます! 誰かが重複したテーブルを含まずに解決策を提案できれば、まだまだ素晴らしいだろう。 – user1659408

    1

    あなたは、既存のテーブルに設定された宛先テーブルでクエリを実行し、切り捨てるように書き込み処分を設定できます

    bq query --allow_large_results --replace --destination_table=mydataset.mytable \ 
        'SELECT * FROM mydataset.mytable 
        WHERE key NOT IN (SELECT key FROM mydataset.update)' 
    bq cp --append_table mydataset.update mydataset.mytable 
    

    特にとして、私はこれがうまくいくと信じていますが、私はそれがバックアップを取る価値があると思いますすぐ後に削除することができます。

    bq cp mydataset.mytable mydataset.backup 
    # You can also build the new table in one pass: 
    bq query --allow_large_results --replace --destination_table=mydataset.mytable \ 
        'SELECT * FROM (
         SELECT * FROM mydataset.mytable 
         WHERE key NOT IN (SELECT key FROM mydataset.update) 
        ), (
         SELECT * FROM mydataset.update 
        )' 
    bq rm mydataset.backup 
    
    +0

    どのように正確に動作し、どのようにmydataset.updateを満たしていますか? –

    0

    あなたは新しい宛先テーブルを設定し、ちょうどすべての列でのカウントとグループを照会することができます

    SELECT 
        FIELD1, 
        FIELD2, 
        FIELD3, 
        FIELD4 
    FROM (
        SELECT 
        COUNT (*), 
        FIELD1, 
        FIELD2, 
        FIELD3, 
        FIELD4 
        FROM 
        [<TABLE>] 
        GROUP BY 
        FIELD1, 
        FIELD2, 
        FIELD3, 
        FIELD4) 
    
    関連する問題