[PYTHON] [Spark] Une histoire sur le fait d'être accro aux pièges de "", null et [] dans DataFrame

Spark2 est-il vraiment effrayant? L'histoire de DataFrame.

Environnement de développement

C'est un vieil article parce qu'il a été écrit il y a quelque temps.

Un exemple de dépendance à la lecture de CSV

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|
+---+----+---+

Lorsque vous chargez un tel fichier, le champ vide sera nul au lieu de "". En d'autres termes, enregistrer au format CSV rend impossible la distinction entre "" et null. S'il vous plaît soyez prudente. Cependant, si les données doivent être lues par une autre application Spark, il peut y avoir un moyen de les enregistrer avec Parquet ou Avro sans utiliser CSV.

Un exemple de dépendance aux fonctions de chaîne

En utilisant le précédent `` df ''.

pyspark


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

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

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

>>> df.fillna("").show()
+---+---+---+
|  x|  y|  z|
+---+---+---+
|  1|   |  2|
+---+---+---+
#nul""Remplacé par.

>>> df.fillna("").select(pyspark.sql.functions.length("y")).show()
+---------+
|length(y)|
+---------+
|        0|
+---------+
# ""C'est vrai.

>>> 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|
+-----------------+
#Ce n'est pas 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|
+---------+
#Pourquoi est-ce 1 et c'est 0...

>>> df.fillna("").select(pyspark.sql.functions.split("y", " ")).collect()
[Row(split(y,  )=[u''])]
# Oh...Certainement même en Python len("".split(" ")) == 1
#Est-ce que ça veut dire que je viens de me faire prendre?...orz

Dans la sortie de show () '', vous ne pouvez pas faire la distinction entre le tableau vide [] et le tableau ["]] avec une chaîne vide ... Étonnamment, ces spécifications ne sont pas correctement écrites dans la Documentation. J'étais impatient.

Recommended Posts

[Spark] Une histoire sur le fait d'être accro aux pièges de "", null et [] dans DataFrame
Je suis accro à la différence dans la façon dont Flask et Django reçoivent les données JSON
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Comment obtenir un nom de colonne et un nom d'index spécifiques avec Pandas DataFrame
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Comment diviser et enregistrer un DataFrame
Comment réattribuer un index dans pandas dataframe
Comment utiliser is et == en Python
Comment générer une séquence en Python et C ++
Addictif quand Kintone est un magasin de données
Ajouter des totaux aux lignes et aux colonnes avec des pandas
Présentation de Spark à EC2 et liaison d'iPython Notebook
Pour représenter la date, l'heure, l'heure et les secondes en Python
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Ce à quoi j'étais accro en combinant l'héritage de classe et l'héritage de table commune dans SQLAlchemy