如何在 Spark (Scala) 中取 RDD 的对数

How to take the logarithm of an RDD in Spark (Scala)

如何取 RDD 的对数?我有一个 val rdd: RDD[Double],我只是想取它的对数。

这与 本质上是同一个问题,但提出的解决方案不起作用。我运行:

val rdd: RDD[Double] = <something>
val log_y = rdd.map(x => org.apache.commons.math3.analysis.function.Log(2.0, x))

我收到错误:

error: object org.apache.commons.math3.analysis.function.Log is not a value

如我所见,math3 中的 class 计算自然对数函数,其工作方式如下:

new org.apache.commons.math3.analysis.function.Log().value(3)
res1: Double = 1.0986122886681098

是Spark 3.1.2自带的版本

val log_y = rdd.map(x => org.apache.commons.math3.analysis.function.Log().value)

如果您使用的是同一版本

这是class的代码:

public class Log implements UnivariateDifferentiableFunction, DifferentiableUnivariateFunction {
    /** {@inheritDoc} */
    public double value(double x) {
        return FastMath.log(x);
    }

    /** {@inheritDoc}
     * @deprecated as of 3.1, replaced by {@link #value(DerivativeStructure)}
     */
    @Deprecated
    public UnivariateFunction derivative() {
        return FunctionUtils.toDifferentiableUnivariateFunction(this).derivative();
    }

    /** {@inheritDoc}
     * @since 3.1
     */
    public DerivativeStructure value(final DerivativeStructure t) {
        return t.log();
    }

}

如你所见,你需要创建一个实例,然后 属性才是真正执行日志功能的。尽管您可以在地图外部创建一个实例并将其标记为 transient 以避免为每个 RDD 元素创建一个新实例。或者您可以在 mapPartition 函数中使用此 class 来为每个分区仅创建一个实例。