[VC_Zeile] [VC_Spalte] [VC_Spalte_Text]
Das Wichtigste zuerst
In der Welt der Datenwissenschaften und Python gibt es ein sehr bekanntes Paket Pandas.
Aber... was sind Pandas?
Pandas bieten wichtige Datenstrukturen wie Reihen, Datenrahmen und Panels, die bei der Manipulation von Datensätzen und Zeitreihen helfen. Die Einführung einer Vielzahl von Operationen macht diese Bibliothek zu einem sehr leistungsstarken Tool. Sie kann kostenlos verwendet werden und ist eine Open-Source-Bibliothek, was sie zu einer der am häufigsten verwendeten Data-Science-Bibliotheken der Welt macht. Finden Sie heraus, wie unsere datentechnische Dienstleistungen kann Ihrem Unternehmen helfen
Die Architektur der Pandas
- Pandas/Kern - Datenstrukturen
- Pandas/src - grundlegende Funktionen sind eingeschrieben C/Zython.
- Pandas/io - Tools zur Eingabe und Ausgabe von Dateien, Daten usw.
- Pandas/Werkzeuge - Codes und Algorithmen für verschiedene Funktionen und Operationen (z. B.: Merge, Join, Verkettung usw.)
- Pandas/spärlich - enthält die spärlichen Versionen, z. B. die Versionen, die für die Behandlung fehlender Werte verschiedener Datenstrukturen erstellt wurden
- Pandas/Statistiken - Funktionen im Zusammenhang mit Statistiken, wie lineare Regression
- Pandas/Util - Testwerkzeuge und verschiedene andere Hilfsprogramme zum Debuggen der Bibliothek.
- Panda/Spy - Schnittstelle, die beim Herstellen einer Verbindung hilft R. Es heißt R2Py
Die wichtigsten Funktionen
- Datenmanipulation
- Umgang mit fehlenden Werten
- Unterstützung von Dateiformaten
- Datenbereinigung
- visualisieren
- Python-Unterstützung
Einfache Codebeispiele
Excel-Dateien schreiben - Testmuster generieren
numpy importieren
zufällig importieren
importiere Pandas als PDF
writer = pd.ExcelWriter ('pandas_simple.xlsx', engine = 'openpyxl')
beispiel_nb = int (1e1)
df = pd.DataFrame (
{'Seite': np.random.random_integers (0, 100, sample_nb),
'Geschlecht': np.random.choice (['männlich', 'weiblich'], sample_nb)})
df.to_excel (writer, blattname='blatt1')
writer.save ()
Excel-Dateien lesen
importiere Pandas als PDF
df = pd.read_excel ('pandas_simple.xlsx', blattname='Blatt1')
df
Ergebnis:
Unbenannt: 0 Jahre, Geschlecht
0 0 43 weiblich
1 1 57 männlich
2 2 9 weiblich
3 3 56 weiblich
4 4 75 männlich
5 5 6 weiblich
6 6 49 männlich
7 7 15 männlich
8 8 19 weiblich
9 9 63 männlich
df.sex.unique ()
Ergebnis:
array (['weiblich', 'männlich'], dtype=Objekt)
df.mean ()
Ergebnis:
Unbenannt: 0 4.5
Seite 39,2
dtype: float64
Koalas
Hauptabsicht davon Projekt besteht darin, Datenwissenschaftlern, die Pandas verwenden, eine Möglichkeit zu bieten, ihre bestehenden Big-Data-Workloads zu skalieren, indem sie sie auf Apache SparkTM ausführen, ohne ihren Code wesentlich zu ändern.
Das Koalas Projekt ermöglicht die Verwendung Pandas API Schnittstelle zu Big Data, indem die Pandas implementiert werden DataFrame-API oben auf Apache Spark.
Pandas ist die De-facto-Standard-DataFrame-Implementierung (Einzelknoten) in Python, während Spark der Standard für die Verarbeitung großer Datenmengen ist.
Das bedeutet, dass POC-Arbeiten, die in Pandas geschrieben wurden, theoretisch sehr einfach in die Spark-Umgebung migriert werden können sollten.
Wenn Sie bereits mit Pandas vertraut sind, können Sie mit Spark sofort produktiv sein, ganz ohne Lernaufwand.
- Pandas - Tests, kleinere Datensätze
- Koalas - große verteilte Datensätze
Warnung
: Koalas implementiert ~ 80% aller Pandas-APIs [Juni 2020]
Koalas wird empfohlen, mit der neuesten Version von Apache Spark 3.0+ zu verwenden:
- Python 3.8
- Spark-Zubehör
- neue Typhinweise
- besserer Betrieb vor Ort
Intern basieren Koalas DataFrames auf der PySpark DataFrame-API. Koalas übersetzt Pandas-APIs in den logischen Plan von Spark SQL, der anschließend optimiert und von der ausgeklügelten und robusten Spark-SQL-Engine ausgeführt wird. Koalas verwendet auch eine verzögerte Bewertungssemantik, um die Leistung zu maximieren. Um eine konforme Pandas-DataFrame-Struktur und ihre umfangreichen APIs zu haben, die eine implizite Reihenfolge erfordern, verfügen Koalas DataFrames über die internen Metadaten, um Pandas-äquivalente Indizes und Spaltenbeschriftungen darzustellen, die den Spalten in PySpark DataFrame zugeordnet sind.
Lass uns mit Databricks spielen
Um die Sache noch schwieriger zu machen, werden wir Excel-Dateien verwenden:) Jemand hat einmal gesagt, dass echte Big Data irgendwann immer Excel beinhaltet. Das Beste wäre, es ganz am Ende des Workflows zu haben, aber das Leben verifiziert es leicht.
Koalas ist eine High-Level-Bibliothek, wir können sie nur auf der Treiberseite installieren. Nichtsdestotrotz müssen wir immer noch Abhängigkeiten auf unseren Knoten installiert haben:
- PySpark >= 2.4 - Treiber + Knoten
- Schafgarbe >= 0.10 - Treiber + Knoten
- Pandas >= 0.23 - Fahrer
- Matplotlib >= 3.0.0 - Fahrer
Installation und Importe:
dbutils.library.installPypi („Koalas“)
dbutils.library.installPypi („openpyxl“)
dbutils.library.restartPython ()
importiere numpy als np
importiere Pandas als PDF
importiere databricks.koalas als ks
Jetzt generieren wir einige Beispieldaten, die als ziemlich schwer angesehen werden und auf einer einzigen Maschine verarbeitet werden müssen. Dies ist eine sehr ungewöhnliche Quelle, daher nutzt der Code keine Hebelwirkung Die von Spark Rahmenleistung:
numpy importieren
zufällig importieren
importiere Pandas als PDF
def sample_dfs (files_nb):
für i im Bereich (files_nb):
beispiel_nb = int (1e5)
ergibt ks.DataFrame (
{'Seite': np.random.randint (0, 100, Beispiel_nb),
'Geschlecht': np.random.choice (['männlich', 'weiblich'], sample_nb)})
für idx, df in enumerate (sample_dfs (100)):
writer = pd.ExcelWriter ('/dbfs/pandas_simple_%03d.xlsx'% idx, engine='openpyxl')
df.to_excel (writer, blattname='blatt1')
writer.save ()
Solch eine unangenehme Quelle kann sofort geladen werden!
kdf = ks.read_excel ('Datei: /dbfs/pandas_simple_*', engine='openpyxl')
kdf.to_spark () .count ()
Ergebnis:
10000000
kdf.count ()
Ergebnis:
Unbenannt: 0 10000
Alter 10000
Sex 10000
dtype: int64
Um zu beweisen, dass Koalas es nutzen Funke wir können verwenden:
kdf.explain (erweitert=Wahr)
Ergebnis:
== Analysierter logischer Plan ==
Projekt [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Seite #32187L, Geschlecht #32188]
+- Projekt [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Alter #32187L, Geschlecht #32188, monotonically_increasing_id () AS __natural_order__ #32197L]
+- MapinPandas <lambda>(Inhalt #32178), [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Alter #32187L, Geschlecht #32188]
+- Projekt [Inhalt #32178]
+- Relation [Pfad #32175, Änderungszeit #32176, Länge #32177L, Inhalt #32178] Binärdatei
== Analysierter logischer Plan ==
__index_level_0__: bigint, unbenannt: 0: bigint, Alter: bigint, Geschlecht: string
Projekt [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Seite #32187L, Geschlecht #32188]
+- Projekt [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Alter #32187L, Geschlecht #32188, monotonically_increasing_id () AS __natural_order__ #32197L]
+- MapinPandas <lambda>(Inhalt #32178), [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Alter #32187L, Geschlecht #32188]
+- Projekt [Inhalt #32178]
+- Relation [Pfad #32175, Änderungszeit #32176, Länge #32177L, Inhalt #32178] Binärdatei
== Optimierter logischer Plan ==
MapinPandas <lambda>(Inhalt #32178), [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Seite #32187L, Geschlecht #32188]
+- Projekt [Inhalt #32178]
+- Relation [Pfad #32175, Änderungszeit #32176, Länge #32177L, Inhalt #32178] Binärdatei
== Physikalischer Plan ==
MapinPandas <lambda>(Inhalt #32178), [__index_level_0__ #32185L, Unbenannt: 0 #32186L, Seite #32187L, Geschlecht #32188]
+- FileScan-Binärdatei [content #32178] Stapelweise: false, DataFilters: [], Format: org.apache.spark.sql.execution.dataSources.BinaryFile.BinaryFileFormat @128c5b73, Speicherort: InMemoryFileIndex [Datei: /dbfs/pandas_simple_003.xlsx, Datei: /dbfs/pandas_simple_009.xlsx, Datei: /dbf..., PartitionFilters: [], pushedFilters: [], readSchema: struct <content:binary>
Bei der Besichtigung DAG Für diesen Datenrahmen können wir in der ersten Phase neue Arten von Operationen beobachten:
FileScan Binärdatei -> Karte in Pandas
Konfiguration
Koalas verfügt über eine Reihe von Konfigurationsoptionen, mit denen sogar der Verarbeitungstyp je nach Schwellenwert zwischen Pandas und PySpark umgeschaltet werden kann. Bitte beachten Sie die Dokumente hier. Bestimmte Optionen können einen großen Einfluss auf die endgültige Verarbeitungszeit haben.
Optionen können global oder für einen Teil des Codes mithilfe von Kontextmanagern festgelegt werden:
importiere databricks.koalas als ks
aus databricks.koalas.config importiere get_option, set_option, reset_option
# Beispiel
opt_value = get_option ('compute.max_rows')
print ('check', opt_value)
set_option ('compute.max_rows', 2000)
opt_value = get_option ('compute.max_rows')
print ('nach der Änderung', opt_value)
reset_option ('compute.max_rows')
print ('nach dem Reset', opt_value)
# oder
ks.options.compute.max_rows = 2000
drucken (ks.options.compute.max_rows)
# Koalas-Optionen werden nur im folgenden Kontext verwendet
mit ks.option_context ('display.max_rows', 10, 'compute.max_rows', 5):
drucken (ks.get_option ('display.max_rows'))
drucken (ks.get_option ('compute.max_rows'))
Interoperabilität zwischen Pandas und Spark
Es gibt mehrere Möglichkeiten, die Spark-Funktionalität auf dem Koalas-Datenrahmen zu verwenden:
importiere databricks.koalas als ks
sdf = spark.createDataFrame (
[(1, 23, 'Marysia'),
(2, 15, „Kasia“),
(3, 17, 'Wojtek')],
schema= ['Index', 'Alter', 'Name'])
sdf.show ()
# +-----+---+-------+
# |index|Alter| Name|
# +-----+---+-------+
# | 1| 23|Marysia|
# | 2| 15| Kasia|
# | 3| 17| Wojtek|
# +-----+---+-------+
# konvertiere spark-df in koalas-df
kdf = sdf.to_koalas ()
# koalas-df in spark-df umwandeln
sdf = kdf.to_spark ()
# Spark-Zubehör
aus pyspark.sql importiere Funktionen als F
kdf ['age_sqrt'] = kdf.age.spark.transform (Lambda-Spalte: f.sqrt (col))
kdf
# Index-Seitenname age_sqrt
# 0 1 23 Marysia 4.795832
# 1 2 15 Kasia 3,872983
# 2 3 17 Wojtek 4.123106
# bewerben
kdf.spark.apply (
lambda sdf: sdf.selectExpr ('Seite + 10 als Alter_next_10_years))
# Alter_nächste_10_Jahre
Nr. 0 33
Nr. 1 25
Nr. 2 27
Beachten Sie, dass sich bewerben from spark accessor wird verwendet, um den gesamten Datenrahmen innerhalb der Lambda-Funktion zu verarbeiten. transformieren wird nur für eine bestimmte Spalte verwendet.
Kommentar
Koalas ist etwas noch Neues. Nichtsdestotrotz kann es eine sehr nützliche Bibliothek sein, insbesondere wenn ein funktionierendes POC-Projekt, das auf Pandas basiert, eine schnelle Migration in eine vollständige Big-Data-Umgebung wie Spark erfordert, um einen viel größeren Maßstab nutzen zu können.
Besuchen Sie unseren Blog für ausführlichere Data Engineering-Artikel:
- Databricks-Tests mit GitHub-Aktionen
- Was ist Datenbank-Denormalisierung?
- Was ist Programmatic Advertising?
[/vc_column_text] [/vc_column] [/vc_row] [vc_row] [vc_column] [vc_single_image image="6559" img_size="full“ onclick="custom_link“ link= „https://dsstream.com/services/data-engineering/"][/vc_column][/vc_row]