数据集/Dataframe中两列值的差

jbose2ul  于 2021-05-17  发布在  Spark
关注(0)|答案(3)|浏览(784)

我有下面的spark数据集/Dataframe。我必须通过找到列2和列3的绝对值之间的差异来创建一个新的列diff\u col

col_1 col_2 col_3
A     5      3
B     null  -2
C     2     null
D     null  null
E     3      1
F     4     -2

预期产量:

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

不知道如何在JavaSpark中实现这一点。在pyspark中,我们可以用lit(0)替换null,然后用col(col\u 2)-col(col\u 3)替换。有java spark等价物吗?

5m1hhzi4

5m1hhzi41#

您可以尝试使用fill方法创建另一个数据集,将指定列的所有空值替换为0(或任何其他数值)。然后继续计算差值。

hgqdbh6s

hgqdbh6s2#

因为只有两列,所以可以使用coalese[1]和lit[2]。

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

然后将其添加为列

ds.withColumn("col_3", this.absoluteBetweenTwo(ds));

另一种解决办法是把你的头发包起来 Dataset 明确地 DataFrameNaFunctions [3] ,并使用 fill 否则不接受javaapi。 fill 将替换所有 NULL 为相应类型的列提供值。

return new DataFrameNaFunctions(ds).fill(0L);

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对象-
三:https://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/dataframenafunctions.html

wlp8pajw

wlp8pajw3#

使用 abs , nvl 内部sql函数 expr 功能。

df
.withColumn(
    "diff_col",
    expr("(abs(nvl(col_2,0)) - abs(nvl(col_3,0)))")
)
.show(false)

输出

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

相关问题