PySpark 2.0 Die Größe oder Form eines DataFrame

75

Ich versuche, die Größe / Form eines DataFrame in PySpark herauszufinden. Ich sehe keine einzige Funktion, die dies kann.

In Python kann ich tun

data.shape()

Gibt es eine ähnliche Funktion in PySpark? Dies ist meine aktuelle Lösung, aber ich suche nach einem Element

row_number = data.count()
column_number = len(data.dtypes)

Die Berechnung der Spaltenanzahl ist nicht ideal ...

Xi Liang
quelle
Dies in eine Funktion setzen?
GwydionFR
Du meinst data.shapefür NumPy und Pandas? shapeist keine Funktion.
flow2k
Was ist nicht ideal? Ich bin mir nicht sicher, was Sie sonst noch erreichen möchten als das, was Sie bereits haben (außer das Ersetzen von data.dtypes durch data.columns, aber es macht wenig Unterschied).
Melkor.cz

Antworten:

124

Sie können es bekommen shapemit:

print((df.count(), len(df.columns)))
George Fisher
quelle
56

Verwenden Sie df.count()diese Option , um die Anzahl der Zeilen abzurufen.

VMEscoli
quelle
20

Fügen Sie dies Ihrem Code hinzu:

import pyspark
def spark_shape(self):
    return (self.count(), len(self.columns))
pyspark.sql.dataframe.DataFrame.shape = spark_shape

Dann können Sie tun

>>> df.shape()
(10000, 10)

Aber erinnern Sie sich nur daran, dass .count()dies bei sehr großen Tischen, die nicht beibehalten wurden, sehr langsam sein kann.

Louis Yang
quelle
7
print((df.count(), len(df.columns)))

ist einfacher für kleinere Datensätze.

Wenn der Datensatz jedoch sehr groß ist, besteht ein alternativer Ansatz darin, Pandas und Pfeile zu verwenden, um den Datenrahmen in Pandas df zu konvertieren und die Form aufzurufen

spark.conf.set("spark.sql.execution.arrow.enabled", "true")
spark.conf.set("spark.sql.crossJoin.enabled", "true")
print(df.toPandas().shape)
Venzu251720
quelle
8
Ist .toPandas nicht eine Aktion? Das heißt: Wird dies nicht die Daten für Ihren Master sammeln und dann Shape aufrufen? Wenn ja, wäre es nicht ratsam, dies zu tun, es sei denn, Sie sind sicher, dass es in das Gedächtnis des Masters passt.
ponadto
2
Wenn der Datensatz sehr groß ist, ist das Sammeln bei Pandas genau das, was Sie NICHT tun möchten. Übrigens: Warum aktivieren Sie dafür Cross Join? Und hilft die Pfeilkonfiguration beim Sammeln für Pandas?
Melkor.cz
3

Ich denke, es gibt keine ähnliche Funktion wie data.shapein Spark. Aber ich werde len(data.columns)eher als verwendenlen(data.dtypes)

YC
quelle
5
das gibt Ihnen nur die Anzahl der Spalten. Was ist mit der Anzahl der Zeilen?
JanLauGe