Leistung von BigQuery DataFrames optimieren
Mit BigQuery DataFrames können Sie Daten in BigQuery mithilfe einer pandas-kompatiblen API analysieren und transformieren. Um die Datenverarbeitung zu beschleunigen und kostengünstiger zu gestalten, können Sie verschiedene Techniken zur Leistungssteigerung einsetzen.
In diesem Dokument werden die folgenden Möglichkeiten zur Leistungsoptimierung beschrieben:
- Teilsortiermodus verwenden
- Ergebnisse nach aufwendigen Vorgängen im Cache speichern:
- Daten mit der Methode
peek()
in der Vorschau ansehen. repr()
-Datenabruf aufschieben:
Teilsortiermodus verwenden
BigQuery DataFrames bietet eine Sortiermodus-Funktion, mit der eine bestimmte Zeilenreihenfolge für Vorgänge wie Fensterfunktionen und Joins erzwungen wird. Sie können den Sortiermodus angeben, indem Sie die Eigenschaft ordering_mode
auf strict
(strikter Sortiermodus, Standardeinstellung) oder partial
(partieller Sortiermodus) festlegen. Mit der Einstellung partial
können Sie Ihre Abfragen effizienter gestalten.
Der Teilsortiermodus unterscheidet sich vom Modus für die strikte Sortierung. Im Modus „Strikte Sortierung“ werden alle Zeilen in einer bestimmten Reihenfolge angeordnet. Durch diese Gesamtsortierung sind BigQuery DataFrames besser mit Pandas kompatibel, da mit der Eigenschaft DataFrame.iloc
ein sortierungsbasierter Zugriff auf Zeilen möglich ist. Aufgrund der Gesamtsortierung und des standardmäßigen sequenziellen Index wird die Anzahl der gescannten Byte jedoch weder durch Spaltenfilter noch durch Zeilenfilter reduziert. Dies wird nur verhindert, wenn Sie diese Filter als Parameter für die Funktionen read_gbq
und read_gbq_table
verwenden. Um alle Zeilen im DataFrame zu sortieren, wird in BigQuery DataFrames ein Hash aller Zeilen erstellt. Dieser Vorgang kann einen vollständigen Datenscan verursachen, bei dem Zeilen- und Spaltenfilter ignoriert werden.
Im Teilsortiermodus wird verhindert, dass BigQuery DataFrames eine Gesamtsortierung für alle Zeilen erstellt. Außerdem werden Funktionen deaktiviert, die eine Gesamtsortierung erfordern, z. B. das DataFrame.iloc
-Attribut. Im Teilsortiermodus wird die DefaultIndexKind
-Klasse auch auf einen Nullindex anstelle eines sequenziellen Index gesetzt.
Wenn Sie ein DataFrame
-Objekt im Teilsortiermodus filtern, berechnet BigQuery DataFrames nicht, welche Zeilen im sequenziellen Index fehlen. Im Teilsortiermodus werden Daten auch nicht automatisch anhand des Index kombiniert. Mit diesen Ansätzen lässt sich die Effizienz Ihrer Abfragen steigern.
Unabhängig davon, ob Sie den standardmäßigen strengen Sortiermodus oder den Teilsortiermodus verwenden, funktioniert die BigQuery DataFrames API wie die vertraute pandas API.
Sowohl beim Teil- als auch beim strengen Sortiermodus zahlen Sie für die von Ihnen verwendeten BigQuery-Ressourcen. Bei der Arbeit mit großen geclusterten und partitionierten Tabellen können Sie jedoch Kosten sparen, wenn Sie den Teilsortiermodus verwenden. Diese Kostensenkung ergibt sich, weil Zeilenfilter für Cluster- und Partitionsspalten die Menge der verarbeiteten Daten reduzieren.
Teilsortiermodus aktivieren
Wenn Sie die Teilsortierung verwenden möchten, setzen Sie das Attribut ordering_mode
auf partial
, bevor Sie andere Vorgänge mit BigQuery DataFrames ausführen, wie im folgenden Codebeispiel gezeigt:
Der Teilsortiermodus verhindert implizite Joins von nicht zusammenhängenden BigQuery-DataFrames-Objekten, da er keinen sequenziellen Index hat.
Stattdessen müssen Sie die Methode DataFrame.merge
explizit aufrufen, um zwei BigQuery DataFrames-Objekte zu verknüpfen, die aus unterschiedlichen Tabellenausdrücken abgeleitet werden.
Die Funktionen Series.unique()
und Series.drop_duplicates()
funktionieren nicht mit dem Teilsortiermodus. Verwenden Sie stattdessen die Methode groupby
, um eindeutige Werte zu finden, wie im folgenden Beispiel gezeigt:
Im Teilsortiermodus ist die Ausgabe der Funktionen DataFrame.head(n)
und Series.head(n)
möglicherweise nicht jedes Mal gleich, wenn Sie sie ausführen. Wenn Sie eine kleine, zufällige Stichprobe der Daten herunterladen möchten, verwenden Sie die Methoden DataFrame.peek()
oder Series.peek()
.
Eine detaillierte Anleitung zur Verwendung des Attributs ordering_mode = "partial"
finden Sie unter Paket-Downloads von PyPI mit BigQuery DataFrames analysieren.
Fehlerbehebung
Da BigQuery-DataFrames im Teilsortiermodus manchmal keine Sortierung oder keinen Index haben, können bei der Verwendung einiger pandas-kompatibler Methoden die folgenden Probleme auftreten.
Fehler: Sortierung erforderlich
Für einige Funktionen wie DataFrame.head()
und DataFrame.iloc
ist eine Sortierung erforderlich. Eine Liste der Funktionen, für die eine Sortierung erforderlich ist, finden Sie in der Spalte Sortierung erforderlich in Unterstützte pandas APIs.
Wenn ein Objekt keine Sortierung hat, schlägt der Vorgang mit einer OrderRequiredError
-Meldung wie der folgenden fehl: OrderRequiredError: Op iloc
requires an ordering. Use .sort_values or .sort_index to provide an ordering.
Wie in der Fehlermeldung angegeben, können Sie mit der DataFrame.sort_values()
-Methode eine Sortierung nach einer oder mehreren Spalten festlegen. Andere Methoden wie DataFrame.groupby()
bieten implizit eine Gesamtordnung basierend auf den Group-by-Schlüsseln.
Wenn die Sortierung keine vollständig stabile Totalordnung für alle Zeilen ist, wird bei späteren Vorgängen möglicherweise eine AmbiguousWindowWarning
-Meldung wie die folgende angezeigt: AmbiguousWindowWarning: Window ordering may be ambiguous, this can
cause unstable results.
Wenn Ihre Arbeitslast nicht deterministische Ergebnisse zulassen kann oder Sie manuell prüfen können, ob die von Ihnen angegebene Sortierung eine Gesamtsortierung ist, können Sie die AmbiguousWindowWarning
-Nachricht so filtern:
Nullindex-Fehler
Für einige Funktionen, z. B. die Eigenschaften DataFrame.unstack()
und Series.interpolate()
, ist ein Index erforderlich. Eine Liste der Funktionen, für die ein Index erforderlich ist, finden Sie in der Spalte Index erforderlich in Unterstützte pandas APIs.
Wenn Sie einen Vorgang verwenden, für den ein Index mit dem Teilsortiermodus erforderlich ist, wird eine NullIndexError
-Nachricht wie die folgende ausgegeben:
NullIndexError: DataFrame cannot perform interpolate as it has no index.
Set an index using set_index.
Wie in der Fehlermeldung angegeben, können Sie mit der DataFrame.set_index()
-Methode einen Index angeben, um nach einer oder mehreren Spalten zu sortieren. Bei anderen Methoden wie DataFrame.groupby()
wird implizit ein Index basierend auf den Group-by-Schlüsseln bereitgestellt, sofern der Parameter as_index=False
nicht festgelegt ist.
Ergebnisse nach aufwendigen Vorgängen im Cache speichern
BigQuery DataFrames speichert Vorgänge lokal und verzögert die Ausführung von Abfragen, bis bestimmte Bedingungen erfüllt sind. Dies kann dazu führen, dass dieselben Vorgänge in verschiedenen Abfragen mehrmals ausgeführt werden.
Um kostspielige Vorgänge nicht zu wiederholen, speichern Sie Zwischenergebnisse mit der Methode cache()
, wie im folgenden Beispiel gezeigt:
Mit dieser Methode wird eine temporäre BigQuery-Tabelle erstellt, in der Ihre Ergebnisse gespeichert werden. Für die Speicherung dieser temporären Tabelle in BigQuery fallen Kosten an.
Daten mit der Methode peek()
in der Vorschau ansehen
BigQuery DataFrames bietet zwei API-Methoden zum Vorschauen von Daten:
peek(n)
gibtn
Zeilen mit Daten zurück, wobein
die Anzahl der Zeilen ist.head(n)
gibt je nach Kontext die erstenn
Datenzeilen zurück, wobein
die Anzahl der Zeilen ist.
Verwenden Sie die head()
-Methode nur, wenn die Reihenfolge der Daten wichtig ist, z. B. wenn Sie die fünf größten Werte in einer Spalte abrufen möchten. In anderen Fällen sollten Sie die Methode peek()
verwenden, um Daten effizienter abzurufen. Das folgende Codebeispiel zeigt, wie das geht:
Sie können auch die Methode peek()
verwenden, um eine kleine, zufällige Stichprobe von Daten herunterzuladen, wenn Sie den Modus für die teilweise Sortierung verwenden.
Abruf der repr()
-Daten aufschieben
Sie können die Methode repr()
in BigQuery DataFrames mit Notebooks oder dem IDE-Debugger aufrufen. Dieser Aufruf löst den head()
-Aufruf aus, mit dem die tatsächlichen Daten abgerufen werden. Dieser Abruf kann Ihren iterativen Programmier- und Debugging-Prozess verlangsamen und auch Kosten verursachen.
Wenn Sie verhindern möchten, dass mit der Methode repr()
Daten abgerufen werden, legen Sie das Attribut repr_mode
auf "deferred"
fest, wie im folgenden Beispiel gezeigt:
Im verzögerten Modus können Sie Ihre Daten nur mit expliziten peek()
- und head()
-Aufrufen in der Vorschau ansehen.
Nächste Schritte
- BigQuery DataFrames verwenden
- BigQuery-DataFrames visualisieren
- Referenz zur BigQuery DataFrames API
- Quellcode, Beispiel-Notebooks und Beispiele für BigQuery DataFrames finden Sie auf GitHub.