如何在 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 来为每个分区仅创建一个实例。
如何取 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 来为每个分区仅创建一个实例。