2016-07-18 6 views
0

Wir verwenden BigQuery religiös und haben zwei Tabellen, die im Wesentlichen durch verschiedene Prozesse parallel aktualisiert wurden. Das Problem, das ich habe, wir haben keine eindeutige Kennung für Tabellen und das Ziel ist es, die beiden Tabellen mit Null-Duplizierung zu kombinieren, wenn möglich. Die eindeutige Kennung ist zwei Spalten kombiniert.BigQuery DeDuplication auf zwei Spalten als eindeutiger Schlüssel

Ich habe verschiedene MySQL-basierte Abfragen ausprobiert, aber keine scheint in BigQuery zu funktionieren. Also poste ich hier etwas Hilfe. :)

Schritt 1. Kopieren Sie die "saubere" Tabelle in eine neue zusammengeführte Tabelle.

Schritt 2. Fragen Sie die "schmutzige" (alte) Tabelle ab und fügen Sie fehlende Einträge ein.

Abfrage Versuch 1:

SELECT 
    COUNT(c.*) 
FROM 
    [flash-student-96619:device_data.device_datav3_20160530] AS old 
WHERE NOT EXISTS (
    SELECT 
    1 
    FROM 
    [flash-student-96619:device_data_v7_merged.20160530] AS new 
    WHERE 
    new.dsn = old.dsn 
    AND new.timestamp = old.timestamp 
) 

Fehler: Fehler bei: 6,1 bis 10,65. Es kann immer nur eine Abfrage ausgeführt werden.

Abfrage Versuch 2:

SELECT 
    * 
FROM 
    [flash-student-96619:device_data.device_datav3_20160530] 
WHERE 
    (dsn, timestamp) NOT IN (
    SELECT 
    dsn, 
    timestamp 
    FROM 
    [flash-student-96619:device_data_v7_merged.20160530] 
) 

Fehler: Fand "",““, "" in Zeile 6, Spalte 7 erwartet hatte: ")" ...

Ehrlich, wenn ich dies in einer Abfrage tun könnte, wäre ich glücklich. Ich muss von zwei Tabellen abrufen und eine neue mit eindeutigen Daten erstellen.

Irgendwelche Hilfe?

Antwort

1

So etwas sollte SELECT in äußeren

SELECT * 
FROM (
    SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY dsn, timestamp) AS dup 
    FROM 
    [flash-student-96619:device_data.device_datav3_20160530], 
    [flash-student-96619:device_data_v7_merged.20160530] 
) 
WHERE dup = 1 

Ich empfehle, mit expliziter Liste von Feldern statt * unten arbeiten, so können Sie dup von den tatsächlichen Ausgang

+0

Was ist mit zwei Tabellen though. Ich möchte mich nicht gegen den einen Tisch entmutigen, sondern an einen anderen Tisch. Ich schätze, ich kann in eine Tabelle schreiben und dann in eine Tabelle schreiben ... – Dovy

+0

das war die folgende Richtung: o) - wie auch immer die zweite Tabelle hinzugefügt - Idee ist es, kombinierte Daten (aus beiden Tabellen) zu deduplizieren und in das Finale zu schreiben sauberer Tisch. hoffe das ist das was du erreichen willst –

+0

Du bringst meinen Freund in Brand. – Dovy

1

Ein bisschen spät auslassen, aber ich wollte darauf hinweisen aus, dass Ihre ursprüngliche Abfrage mit geringen Änderungen unter Verwendung von standard SQL funktioniert (deaktivieren Sie das Kontrollkästchen "Legacy SQL verwenden" unter "Optionen anzeigen"). Ich musste nur new zu etwas anderem ändern, da das ein reserviertes Schlüsselwort ist. Zum Beispiel dieser Abfrage gilt:

WITH OldData AS (
    SELECT 
    x AS dsn, 
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL x HOUR) AS timestamp 
    FROM UNNEST([1, 2, 3, 4]) AS x), 
NewData AS (
    SELECT 
    x AS dsn, 
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL x HOUR) AS timestamp 
    FROM UNNEST([5, 2, 1, 6]) AS x) 
SELECT 
    COUNT(*) 
FROM OldData oldData 
WHERE NOT EXISTS (
    SELECT 1 
    FROM NewData newData 
    WHERE 
    newData.dsn = oldData.dsn 
    AND newData.timestamp = oldData.timestamp 
); 
+-----+ 
| f0_ | 
+-----+ 
| 2 | 
+-----+ 

In Bezug auf Ihren zweiten Versuch, können Sie tun:

WITH OldData AS (
    SELECT 
    x AS dsn, 
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL x HOUR) AS timestamp 
    FROM UNNEST([1, 2, 3, 4]) AS x), 
NewData AS (
    SELECT 
    x AS dsn, 
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL x HOUR) AS timestamp 
    FROM UNNEST([5, 2, 1, 6]) AS x) 
SELECT 
    * 
FROM OldData 
WHERE 
    STRUCT(dsn, timestamp) NOT IN (
    SELECT AS STRUCT 
    dsn, 
    timestamp 
    FROM NewData); 
+-----+---------------------+ 
| dsn |  timestamp  | 
+-----+---------------------+ 
| 3 | 2016-07-21 11:54:08 | 
| 4 | 2016-07-21 10:54:08 | 
+-----+---------------------+ 
Verwandte Themen