[PYTHON] [Spark] Ich bin süchtig nach "", null und [] in DataFrame

Ist Spark2 wirklich beängstigend? Die Geschichte von DataFrame.

Entwicklungsumgebung

Es ist ein alter Artikel, weil er vor einiger Zeit geschrieben wurde.

Ein Beispiel dafür, wie man süchtig nach CSV ist

input.csv


x,y,z
1,,2

pyspark


>>> df = spark.read.csv("input.csv", header=True)
>>> df
DataFrame[x: string, y: string, z: string]
>>> df.show()
+---+----+---+
|  x|   y|  z|
+---+----+---+
|  1|null|  2|
+---+----+---+

Wenn Sie eine solche Datei laden, ist das leere Feld null anstelle von "". Mit anderen Worten, das Speichern als CSV macht "" und null nicht unterscheidbar. Bitte seien Sie vorsichtig. Wenn die Daten jedoch von einer anderen Spark-App gelesen werden, können Sie sie mit Parkett oder Avro ohne Verwendung von CSV speichern.

Ein Beispiel dafür, wie man von String-Funktionen abhängig ist

Verwenden Sie das vorherige df.

pyspark


>>> df.select(pyspark.sql.functions.length("y")).show()
+---------+
|length(y)|
+---------+
|     null|
+---------+
#Verstehen.

>>> df.select(pyspark.sql.functions.split("y", " ")).show()
+-----------+
|split(y,  )|
+-----------+
|       null|
+-----------+
#Gut verstanden.

>>> df.select(pyspark.sql.functions.size(pyspark.sql.functions.split("y", " "))).show()
+-----------------+
|size(split(y,  ))|
+-----------------+
|               -1|
+-----------------+
# -1?Gut...

>>> df.fillna("").show()
+---+---+---+
|  x|  y|  z|
+---+---+---+
|  1|   |  2|
+---+---+---+
#Null""Ersetzt mit.

>>> df.fillna("").select(pyspark.sql.functions.length("y")).show()
+---------+
|length(y)|
+---------+
|        0|
+---------+
# ""Korrekt.

>>> df.fillna("").select(pyspark.sql.functions.split("y", " ")).show()
+-----------+
|split(y,  )|
+-----------+
|         []|
+-----------+
#Sayana.

>>> df.fillna("").select(pyspark.sql.functions.size(pyspark.sql.functions.split("y", " "))).show()
+-----------------+
|size(split(y,  ))|
+-----------------+
|                1|
+-----------------+
#Es ist nicht 0??

>>> df2 = spark.createDataFrame([[[]]], "arr: array<string>")
>>> df2
DataFrame[arr: array<string>]
>>> df2.show()
+---+
|arr|
+---+
| []|
+---+

>>> df2.select(pyspark.sql.functions.size("arr")).show()
+---------+
|size(arr)|
+---------+
|        0|
+---------+
#Warum ist das 1 und das ist 0...

>>> df.fillna("").select(pyspark.sql.functions.split("y", " ")).collect()
[Row(split(y,  )=[u''])]
# Oh...Sicher auch in Python len("".split(" ")) == 1
#Heißt das, ich wurde gerade erwischt?...orz

In der Ausgabe von show () können Sie nicht zwischen dem leeren Array [] und dem Array `` ["]] mit einer leeren Zeichenfolge unterscheiden ... Überraschenderweise sind diese Spezifikationen in der Dokumentation nicht richtig geschrieben. Ich war ungeduldig

Recommended Posts

[Spark] Ich bin süchtig nach "", null und [] in DataFrame
Ich bin süchtig nach dem Unterschied, wie Flask und Django JSON-Daten empfangen
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
So erhalten Sie mit pandas DataFrame einen bestimmten Spaltennamen und Indexnamen
Der Dateiname war in Python schlecht und ich war süchtig nach Import
So teilen und speichern Sie einen DataFrame
So weisen Sie den Index im Pandas-Datenrahmen neu zu
Verwendung ist und == in Python
So generieren Sie eine Sequenz in Python und C ++
Macht süchtig, wenn Kintone ein Datenspeicher ist
Fügen Sie mit Pandas Summen zu Zeilen und Spalten hinzu
Einführung in Spark in EC2 und Verknüpfung von iPython Notebook
Zur Darstellung von Datum, Uhrzeit, Uhrzeit und Sekunden in Python
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Wovon ich süchtig war, als ich Klassenvererbung und gemeinsame Tabellenvererbung in SQLAlchemy kombinierte