Предположим, что следующий фрейм данных
val df = spark.read
.option("inferSchema", "true")
.option("header", "true")
.option("ignoreTrailingWhiteSpace", "true")
.csv(spark.sparkContext.parallelize(
"""key,pct1,pct2,pct3,factor
a,.1,.2,.3,5
b,.1,.2,.3,5"""
.split("\n")).toDS)
df.show
+--------+----+----+----+------+
| key|pct1|pct2|pct3|factor|
+--------+----+----+----+------+
| a| 0.1| 0.2| 0.3| 5|
| b| 0.1| 0.2| 0.3| 5|
+--------+----+----+----+------+
Следующее работает нормально
df.withColumn("New", df.columns.filter(_.contains("pct")).map(col)
.reduceLeft((cur, next) => (next - cur) / col("factor"))).show
+--------+----+----+----+------+--------------------+
| key|pct1|pct2|pct3|factor| New|
+--------+----+----+----+------+--------------------+
| a| 0.1| 0.2| 0.3| 5|0.055999999999999994|
| b| 0.1| 0.2| 0.3| 5|0.055999999999999994|
+--------+----+----+----+------+--------------------+
Но я не могу заставить столбец фактора работать с функцией мощности.
df.withColumn("New", df.columns.filter(_.contains("pct")).map(col)
.reduceLeft((cur, next) => (next - cur) / scala.math.pow(col("factor"),2))).show
error: type mismatch;
found : org.apache.spark.sql.Column
required: Double
.reduceLeft((cur, next) => (next - cur) / scala.math.pow(col("factor"),2))).show
Почему я могу получить col ("коэффициент") в первом примере, но не могу получить степенную функцию?