J'ai le jeu de données / dataframe ci-dessous. Je dois créer une nouvelle colonne diff_col en trouvant la différence entre les valeurs absolues de col_2 et col_3
col_1 col_2 col_3 diff_col A 5 3 2 B null -2 -2 C 2 null 2 D null null 0 E 3 1 2 F 4 -2 2
Production attendue:
col_1 col_2 col_3 A 5 3 B null -2 C 2 null D null null E 3 1 F 4 -2
Je ne sais pas comment faire cela dans java spark. Dans pyspark, nous pouvons le faire en remplaçant null par lit (0) puis col (col_2) - col (col_3). Existe-t-il un équivalent java spark pour cela?
3 Réponses :
Vous pouvez essayer d'utiliser la méthode de remplissage qui crée un autre ensemble de données en remplaçant toutes les valeurs nulles par 0 (ou toute autre valeur numérique) pour les colonnes spécifiées. Ensuite, vous pouvez continuer à calculer la différence.
Vous pouvez utiliser le charbon [1] et allumé [2] car vous n'avez que deux colonnes.
return new DataFrameNaFunctions(ds).fill(0L);
Et que l'ajouter comme colonne
ds.withColumn("col_3", this.absoluteBetweenTwo(ds));
La solution alternative consiste à envelopper votre Dataset
explicitement dans DataFrameNaFunctions
[3], et à utiliser fill
autrement non acceptable de l'API Java.
fill
remplacera tous les NULL
par la valeur fournie pour les colonnes du type correspondant.
private Column absoluteBetweenTwo(final Dataset<Row> ds) { final Column col_1 = functions.coalesce(ds.col("col_1"), functions.lit(0)); final Column col_2 = functions.coalesce(ds.col("col_2"), functions.lit(0)); return functions.abs(col_1.minus(col_2)); }
3: https://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/DataFrameNaFunctions.html
Utilisez les fonctions SQL abs
, nvl
fonction expr
.
+-----+-----+-----+--------+ |col_1|col_2|col_3|diff_col| +-----+-----+-----+--------+ |A |5 |3 |2 | |B |null |-2 |-2 | |C |2 |null |2 | |D |null |null |0 | |E |3 |1 |2 | |F |4 |-2 |2 | +-----+-----+-----+--------+
Production
df .withColumn( "diff_col", expr("(abs(nvl(col_2,0)) - abs(nvl(col_3,0)))") ) .show(false)