Leistung von BigQuery DataFrames optimieren
Mit BigQuery DataFrames können Sie Daten in BigQuery mit einer pandas-kompatiblen API analysieren und transformieren. Um die Datenverarbeitung zu beschleunigen und kostengünstiger zu gestalten, können Sie verschiedene Techniken zur Leistungssteigerung verwenden.
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. - Datenabruf mit
repr()verzögern.
Teilsortiermodus verwenden
BigQuery DataFrames bietet eine Sortiermodusfunktion, mit der eine bestimmte Zeilenreihenfolge für Vorgänge wie Fensterfunktionen und Joins erzwungen wird. Sie können
den Sortiermodus angeben, indem Sie die ordering_mode Eigenschaft auf entweder
strict (auch strenger Sortiermodus genannt, die Standardeinstellung) oder
partial (auch Teilsortiermodus genannt) festlegen. Mit der Einstellung partial können Sie Ihre Abfragen effizienter gestalten.
Der Teilsortiermodus unterscheidet sich vom strengen Sortiermodus. Im strengen Sortiermodus werden alle Zeilen in einer bestimmten Reihenfolge angeordnet. Durch diese Gesamtsortierung funktioniert BigQuery DataFrames besser mit pandas, da Sie mit der Eigenschaft DataFrame.iloc auf Zeilen nach ihrer Reihenfolge zugreifen können. Aufgrund der Gesamtsortierung und des standardmäßigen sequenziellen Index wird die Anzahl der gescannten Byte jedoch weder durch Spaltenfilter noch durch Zeilenfilter reduziert. Dies ist nur möglich, wenn Sie diese
Filter als Parameter auf die read_gbq und read_gbq_table Funktionen anwenden. Um alle Zeilen im DataFrame zu sortieren, wird in BigQuery DataFrames ein Hash aller Zeilen erstellt. Dieser Vorgang kann zu einem vollständigen Datenscan führen, bei dem Zeilen- und Spaltenfilter ignoriert werden.
Im Teilsortiermodus wird verhindert, dass in BigQuery DataFrames eine Gesamtsortierung für alle Zeilen erstellt wird. Außerdem werden Funktionen deaktiviert, für die eine Gesamtsortierung erforderlich ist, z. B. die Eigenschaft DataFrame.iloc. Im Teilsortiermodus wird die
DefaultIndexKind Klasse
auf einen Nullindex anstelle eines sequenziellen Index gesetzt.
Wenn Sie ein DataFrame-Objekt im Teilsortiermodus filtern, wird in BigQuery DataFrames nicht berechnet, welche Zeilen im sequenziellen Index fehlen. Außerdem werden Daten im Teilsortiermodus nicht automatisch anhand des Index kombiniert. Mit diesen Ansätzen können Sie 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 bekannte 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. Dies liegt daran, dass Zeilenfilter für Cluster- und Partitionsspalten die Anzahl der verarbeiteten Daten reduzieren.
Teilsortiermodus aktivieren
Wenn Sie die Teilsortierung verwenden möchten, setzen Sie die Eigenschaft ordering_mode auf partial, bevor Sie andere Vorgänge mit BigQuery DataFrames ausführen, wie im folgenden Codebeispiel gezeigt:
Im Teilsortiermodus werden keine impliziten Joins von nicht zusammenhängenden BigQuery DataFrames-Objekten ausgeführt, da kein sequenzieller Index vorhanden ist.
Stattdessen müssen Sie die Methode DataFrame.merge explizit aufrufen, um zwei BigQuery DataFrames-Objekte zusammenzuführen, die von verschiedenen Tabellenausdrücken abgeleitet wurden.
Die Funktionen Series.unique() und Series.drop_duplicates() funktionieren nicht im 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 bei jeder Ausführung gleich. Verwenden Sie die
DataFrame.peek() oder Series.peek() Methoden, um eine kleine zufällige Stichprobe der Daten herunterzuladen.
Eine detaillierte Anleitung zur Verwendung der ordering_mode = "partial"
Eigenschaft finden Sie unter
Paketdownloads von PyPI mit BigQuery DataFrames analysieren.
Fehlerbehebung
Da in BigQuery DataFrames im Teilsortiermodus manchmal keine Sortierung oder kein Index vorhanden ist, 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 unter
Unterstützte pandas APIs.
Wenn ein Objekt keine Sortierung hat, schlägt der Vorgang mit der
OrderRequiredError Meldung fehl, z. B.: OrderRequiredError: Op iloc
requires an ordering. Use .sort_values or .sort_index to provide an ordering.
Wie in der Fehlermeldung angegeben, können Sie eine Sortierung mit der
DataFrame.sort_values() Methode
vornehmen, um nach einer oder mehreren Spalten zu sortieren. Andere Methoden wie
DataFrame.groupby(),
bieten implizit eine Gesamtsortierung basierend auf den Gruppierungsschlüsseln.
Anders als bei pandas kann die Ausführung desselben Codes im Teilsortiermodus jedes Mal zu unterschiedlichen Ergebnissen führen. Um konsistente Ergebnisse zu erzielen, verwenden Sie eine stabile Gesamtsortierung für alle Zeilen.
Fehler: Nullindex
Für einige Funktionen wie DataFrame.unstack() und Series.interpolate() ist ein Index erforderlich. Eine Liste der Funktionen, für die ein Index erforderlich ist, finden Sie unter
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 Meldung 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 einen Index mit der
DataFrame.set_index() Methode
erstellen, um nach einer oder mehreren Spalten zu sortieren. Andere Methoden wie
DataFrame.groupby(), bieten implizit einen Index basierend auf den Gruppierungsschlüsseln, es sei denn, der
as_index=False Parameter ist festgelegt.
Ergebnisse nach aufwendigen Vorgängen im Cache speichern
In BigQuery DataFrames werden Vorgänge lokal gespeichert und die Ausführung von Abfragen wird verzögert, bis bestimmte Bedingungen erfüllt sind. Dies kann dazu führen, dass dieselben Vorgänge in verschiedenen Abfragen mehrmals ausgeführt werden.
Um wiederholte kostspielige Vorgänge zu vermeiden, 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. Die Speicherung dieser temporären Tabelle in BigQuery wird in Rechnung gestellt.
Daten mit der Methode peek() in der Vorschau ansehen
BigQuery DataFrames bietet zwei API-Methoden zum Ansehen einer Datenvorschau:
peek(n)gibtnZeilen mit Daten zurück, wobeindie Anzahl der Zeilen ist.head(n)gibt je nach Kontext die erstennZeilen mit Daten zurück, wobeindie Anzahl der Zeilen ist.
Verwenden Sie die Methode head() nur, wenn die Reihenfolge der Daten wichtig ist, z. B. wenn Sie die fünf größten Werte in einer Spalte benötigen. In anderen Fällen verwenden Sie die Methode peek() für einen effizienteren Datenabruf, wie im folgenden Codebeispiel gezeigt:
Sie können die Methode peek() auch verwenden, um eine kleine zufällige Stichprobe der Daten herunterzuladen
während Sie den Teilsortiermodus verwenden.
Datenabruf mit repr() verzögern
Sie können die repr() Methode in BigQuery DataFrames mit
Notebooks oder dem Debugger Ihrer IDE aufrufen. Dieser Aufruf löst den Aufruf head() aus, mit dem die tatsächlichen Daten abgerufen werden. Dieser Abruf kann den iterativen Programmier- und Debuggingprozess verlangsamen und auch Kosten verursachen.
Um zu verhindern, dass die Methode repr() Daten abruft, setzen Sie das Attribut repr_mode
auf "deferred", 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
- Informationen zu BigQuery DataFrames.
- BigQuery DataFrames visualisieren
- Referenz zur BigQuery DataFrames API
- BigQuery DataFrames Quellcode, Beispielnotebooks und Beispiele auf GitHub ansehen