web-dev-qa-db-fra.com

Comment remplacer les valeurs NULL par une valeur spécifique dans Dataframe en utilisant spark en Java?

J'essaie d'améliorer la précision de l'algorithme de régression logistique mis en œuvre dans Spark à l'aide de Java. Pour cela, j'essaie de remplacer les valeurs Null ou invalides présentes dans une colonne avec la valeur la plus fréquente de cette colonne. Par exemple:-

Name|Place
a   |a1
a   |a2
a   |a2
    |d1
b   |a2
c   |a2
c   |
    |
d   |c1

Dans ce cas, je remplacerai toutes les valeurs NULL dans la colonne "Nom" par "a" et dans la colonne "Place" avec "a2". Jusqu'à présent, je ne peux extraire que les colonnes les plus fréquentes d'une colonne. Pouvez-vous s'il vous plaît m'aider avec la deuxième étape sur la façon de remplacer les valeurs nulles ou invalides par les valeurs les plus fréquentes de cette colonne.

14
PirateJack

Vous pouvez utiliser la fonction .na.fill (il s'agit d'une fonction dans org.Apache.spark.sql.DataFrameNaFunctions ).

La fonction dont vous avez besoin est la suivante: def fill(value: String, cols: Seq[String]): DataFrame

Vous pouvez choisir les colonnes, et vous choisissez la valeur pour laquelle vous souhaitez remplacer le null ou le NaN.

Dans votre cas, ce sera quelque chose comme:

val df2 = df.na.fill("a", Seq("Name"))
            .na.fill("a2", Seq("Place"))
21
Rami

Vous voudrez utiliser la méthode de remplissage (valeur de chaîne, colonnes de chaîne []) de votre structure de données, qui remplace automatiquement les valeurs Null dans une liste donnée de colonnes par la valeur que vous avez spécifiée.

Donc, si vous connaissez déjà la valeur que vous souhaitez remplacer par Null par ...:

String[] colNames = {"Name"}
dataframe = dataframe.na.fill("a", colNames)

Vous pouvez faire la même chose pour le reste de vos colonnes.

7
Dan Carter

Vous pouvez utiliser DataFrame.na.fill() pour remplacer le null par une valeurPour mettre à jour immédiatement, vous pouvez faire 

val map = Map("Name" -> "a", "Place" -> "a2")

df.na.fill(map).show()

Mais si vous souhaitez également remplacer un mauvais enregistrement, vous devez d'abord valider les mauvais enregistrements. Vous pouvez le faire en utilisant une expression régulière avec la fonction like.

4
Shankar Koirala

Afin de remplacer les valeurs NULL par une chaîne donnée, j'ai utilisé la fonction fill présente dans Spark pour Java. Il accepte le mot à remplacer par une séquence de noms de colonnes. Voici comment j'ai implémenté cela: -

List<String> colList = new ArrayList<String>();
colList.add(cols[i]);
Seq<String> colSeq = scala.collection.JavaConverters.asScalaIteratorConverter(colList.iterator()).asScala().toSeq();
data=data.na().fill(Word, colSeq);
0
PirateJack