Remplacer les cordes à vide avec Aucun/valeurs null dans DataFrame
J'ai un Spark 1.5.0 DataFrame avec un mélange de null
et des chaînes vides dans la même colonne. Je veux convertir toutes les chaînes vides dans toutes les colonnes de null
(None
, en Python). Le DataFrame peut avoir des centaines de colonnes, donc j'essaie d'éviter codée en dur manipulations de chaque colonne.
Voir ma tentative ci-dessous, ce qui entraîne une erreur.
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
## Create a test DataFrame
testDF = sqlContext.createDataFrame([Row(col1='foo', col2=1), Row(col1='', col2=2), Row(col1=None, col2='')])
testDF.show()
## +----+----+
## |col1|col2|
## +----+----+
## | foo| 1|
## | | 2|
## |null|null|
## +----+----+
## Try to replace an empty string with None/null
testDF.replace('', None).show()
## ValueError: value should be a float, int, long, string, list, or tuple
## A string value of null (obviously) doesn't work...
testDF.replace('', 'null').na.drop(subset='col1').show()
## +----+----+
## |col1|col2|
## +----+----+
## | foo| 1|
## |null| 2|
## +----+----+
Non, il n'est pas revenir une liste. Elle renvoie d'un DataFrame. J'ai mis à jour la question avec un lien vers l'Étincelle de la documentation.
ce n'est pas un Python question! Spark DataFrames sont distribués structure de données utilisée généralement pour permettre lourds de l'analyse des données sur les données big data. Si vous êtes à la solution n'est pas adaptée.
Pour dire la vérité Pythonic
mais il a demandé à l'OP pour retourner une liste...
ce n'est pas un Python question! Spark DataFrames sont distribués structure de données utilisée généralement pour permettre lourds de l'analyse des données sur les données big data. Si vous êtes à la solution n'est pas adaptée.
Pour dire la vérité Pythonic
lambda x: None if not x else x
enveloppé avec udf
serait très bien fonctionner 🙂mais il a demandé à l'OP pour retourner une liste...
OriginalL'auteur dnlbrky | 2015-10-22
Vous devez vous connecter pour publier un commentaire.
C'est aussi simple que cela:
Si vous voulez remplir plusieurs colonnes, vous pouvez par exemple réduire:
ou de l'utilisation de la compréhension:
Si vous voulez spécifiquement pour fonctionner sur des champs de type chaîne veuillez vérifier la réponse par robin loxley.
Je ne vois aucune raison pourquoi vous ne pourriez pas. DataFrames sont paresseusement évalué et le reste est juste un standard de Python. Vous trouverez quelques options de la modifier.
Je vais accepter cette réponse, mais pourriez-vous s'il vous plaît ajouter le bit de @RobinLoxley en premier? Ou, si vous n'avez pas l'esprit, je peux modifier votre réponse.
Il ne serait pas juste.
La déclaration
.otherwise(None)
n'est pas nécessaire. Aucun n'est toujours retourné pour inégalée conditions (voir la section spark.apache.org/docs/latest/api/python/...)OriginalL'auteur zero323
Ma solution est beaucoup mieux que toutes les solutions que j'ai réussit à vu jusqu'à présent, qui peut traiter avec autant de champs que vous le souhaitez, de voir le peu de fonction comme suit:
Vous pouvez facilement réécrire la fonction ci-dessus en Python.
J'ai appris ce truc de @liancheng
OriginalL'auteur soulmachine
Simplement ajouter sur le dessus de zero323 et soulmachine réponses. Convertir pour tous les Chaînetapez champs.
OriginalL'auteur Robin Loxley
Udf ne sont pas terriblement efficace. La manière correcte de le faire à l'aide d'une méthode intégrée est:
OriginalL'auteur bloodrootfc