Ist Spark2 wirklich beängstigend? Die Geschichte von DataFrame.
Es ist ein alter Artikel, weil er vor einiger Zeit geschrieben wurde.
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.
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