gpt4 book ai didi

java - Spark Java 使用数学运算来获取具有最大截止值的值比例

转载 作者:行者123 更新时间:2023-12-05 05:35:03 25 4
gpt4 key购买 nike

我在概念上非常了解 Spark,但我仍在浏览表达式的特定语法选项。我在 Java 17 中使用 Spark 3.3.0。

我有一个表,其中有一列 foo它的值不应远高于 30。我想添加一个比例为 foo 的列与 30 , 即 foo 的值标准化为 0.0 <= proportion <= 1.0截断值为 30对于 foo .最后foo是十进制类型,在 Java 中表示为 BigDecimal .

我可能会在 Java 中这样计算:

BigDecimal maxVal = new BigDecimal(30); 
BigDecimal proportion = foo.max(maxVal).divide(maxVal);

(或者我可以先除以 maxVal 并取结果和 1.0 的最大值,尽管上面的第一种方法在语义上可能更有效和更直接。)

我如何在 Spark 中最好地做到这一点?以下似乎有效并且让我大部分时间都在那里:

BigDecimal maxVal = new BigDecimal(30);
df = df.withColumn("proportion", col("foo").divide(maxVal));

但是 max() 呢?部分,以便我可以切断 30 处的值?我能随手找到的唯一“最大”函数是 Spark SQL MAX()聚合函数。

最佳答案

同时 minmax是作用于一组行的聚合函数,函数 leastgreatest可以比较行内的值或与常量值。

import static org.apache.spark.sql.functions.*;

Dataset<Row> df = ...
BigDecimal maxVal=new BigDecimal(30);
df.withColumn("proportion", greatest(col("value"), lit(maxVal)).divide(maxVal)).show();

输出:

+-----+----------+
|value|proportion|
+-----+----------+
| 1| 1.000000|
| 10| 1.000000|
| 20| 1.000000|
| 30| 1.000000|
| 31| 1.033333|
| 40| 1.333333|
+-----+----------+

如果值的上限应为 maxValue,则应使用 least 而不是 greatest(这对应于在非 Spark 代码):

df.withColumn("proportion", least(col("value"), lit(maxVal)).divide(maxVal)).show();

现在输出:

+-----+----------+
|value|proportion|
+-----+----------+
| 1| 0.033333|
| 10| 0.333333|
| 20| 0.666667|
| 30| 1.000000|
| 31| 1.000000|
| 40| 1.000000|
+-----+----------+

关于java - Spark Java 使用数学运算来获取具有最大截止值的值比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73561947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com