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. Die Gesamtordnung und der zugehörige sequenzielle Standardindex verhindern jedoch, dass durch Filter für Spalten oder Zeilen die Menge der gescannten Daten reduziert wird. 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.
Anders als bei Pandas kann es im Modus für die teilweise Sortierung vorkommen, dass bei jedem Ausführen desselben Codes unterschiedliche Ergebnisse erzielt werden. Um konsistente Ergebnisse zu erzielen, sollten Sie für alle Zeilen eine stabile Gesamtordnung verwenden.
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)gibt- nZeilen mit Daten zurück, wobei- ndie Anzahl der Zeilen ist.
- head(n)gibt je nach Kontext die ersten- nDatenzeilen zurück, wobei- ndie 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. Ein Beispiel dafür finden Sie im folgenden Code-Snippet:
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.