2017-01-23 7 views
0

Ich habe eine DAY partitionierte Tabelle in BigQuery, wo ich Zeilen entfernen möchte, in denen ein bestimmter Spaltenwert dupliziert wird (ich möchte nur den letzten solchen Wert, sortiert nach einer Timestamp-Spalte). Jetzt, da die SQL-Sprache bigquery keine partitionierten Tabellen unterstützt (und andere Einschränkungen hat), denke ich, was ich tun muss, ist eine temporäre Tabelle zu erstellen, die eine gefilterte Ansicht des Originals ist, das Original zu löschen und dann eine Kopie davon auszuführen die temporäre Tabelle auf den ursprünglichen Namen und löschen Sie die temporäre Tabelle. Ich kann dies wie folgt mit etwas tun:Filtern von partitionierten Tabellen

SELECT * EXCEPT(row_number) FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY partition_col order by time_col desc) row_number FROM my_partioned_table ) WHERE row_number = 1

Aber wie ich mit diesem Ansatz die Partitionierungsinformationen konservieren?

Wenn ich eine vollständige Tabelle kopiere, bleiben die Portionierungsinformationen erhalten, aber was mache ich, wenn ich effektiv eine gefilterte Ansicht einer Tabelle erstellen möchte, die auch die Partitionierung erhält?

Antwort

1

Wenn Ihre Änderungen sich nun über mehrere Partitionen erstrecken, müssen Sie für jede Partition separat eine Abfrage ausführen.

  1. Temporäre Tabelle als partitioniert erstellen.
  2. Führen Sie eine Abfrage aus, die eine gefilterte Ansicht der Tabelle zurückgibt, jeweils eine Partition (mit einem Filter für _PARTITIONTIME) und an die rechte Partition der temporären Tabelle anfügt. (Zum Beispiel wäre die Zieltabelle die Tabelle $ 20170115, wenn Sie an der Partition für 20170115 arbeiten).
  3. Kopieren von der temporären Tabelle in die Endergebnistabelle, Partitionierungsinformationen werden bei der Tabellenkopie voraussichtlich beibehalten.
Verwandte Themen