2012-09-10 19 views
7

Planuję codziennie dodawać dane przyrostowe do tabeli BigQuery. Za każdym razem, gdy dodaję dane przyrostowe do istniejącej tabeli, chcę wyeliminować zduplikowane rekordy (na podstawie kolumny klucza podstawowego) z istniejących danych w tabeli. Jedno podejście byłoby -Eliminowanie duplikatów rekordów w tabeli BigQuery

  1. Zebrać zestaw kluczy z pierwotnych danych (pozwala wywołać INCR_KEYS)
  2. uruchomić kwerendę na liniach - SELECT all_cols from table where pkey_col NOT IN (INCR_KEYS) - i przechowywać wyniki w nowej tabeli.
  3. Dołącz dane przyrostowe do nowej tabeli.

Moja troska o takie podejście polega na tym, że tworzy duplikat dużego stołu i dodaje do moich rachunków.

Czy istnieje lepszy sposób osiągnięcia tego samego bez tworzenia duplikatu tabeli?

+0

Jak duże jest tabela? Jeśli skompresowane zostanie więcej niż 64 MB, błąd nr 2 zakończy się niepowodzeniem. –

+0

@RyanBoyd - To nie powinno być problemem. Jeśli INCR_KEYS> 64 MB, mógłbym podzielić INCR_KEYS na mniejsze kawałki i powtórzyć <2> – user1659408

+0

Problem polega na tym, że pełna tabela (tj. Dane nie w INCR_KEYS) ma> 64 MB. Zapytanie SELECT w punkcie 2 nie powiedzie się. –

Odpowiedz

4

Nie wiem, jak to zrobić bez tworzenia duplikatu tabeli - to brzmi jak całkiem sprytne rozwiązanie.

Koszt dodatkowy może być jednak bardzo mały - BigQuery nalicza tylko rachunki za dane za czas, który istnieje. Jeśli usuniesz stary stół, musisz zapłacić za obie tabele przez okres sekund lub minut.

+0

Dzięki @Jordan, mogę z tym żyć! Byłoby świetnie, gdyby ktoś mógł zaproponować rozwiązanie bez korzystania z duplikatów tabel. – user1659408

1

Można uruchomić kwerendę z tabeli docelowej ustawionej na istniejącej tabeli i ustawić zapisu dyspozycję obciąć:

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 

Wierzę, że to będzie działać, ale myślę, że warto wziąć kopię zapasową, zwłaszcza możesz go szybko usunąć.

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

Jak dokładnie by to działało i jak wypełniasz plik mydataset.update? –

0

Można ustawić nową tabelę docelową i po prostu zapytać zliczania i grupy przez wszystkie kolumny:

SELECT 
    FIELD1, 
    FIELD2, 
    FIELD3, 
    FIELD4 
FROM (
    SELECT 
    COUNT (*), 
    FIELD1, 
    FIELD2, 
    FIELD3, 
    FIELD4 
    FROM 
    [<TABLE>] 
    GROUP BY 
    FIELD1, 
    FIELD2, 
    FIELD3, 
    FIELD4) 
Powiązane problemy