0
votes

Java Spark - Différence de deux valeurs de colonne dans l'ensemble de données / dataframe

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?


0 commentaires

3 Réponses :


0
votes

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.


0 commentaires

1
votes

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));
    }

1: https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/functions.html#coalesce-org.apache.spark.sql.Column...-

2: https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/functions.html#lit-java.lang.Object-

3: https://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/DataFrameNaFunctions.html


0 commentaires

0
votes

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)


0 commentaires