Spark - как получить значение, а не сам столбец? - PullRequest
0 голосов
/ 11 июля 2020

Предположим, что следующий фрейм данных

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 ("коэффициент") в первом примере, но не могу получить степенную функцию?

1 Ответ

3 голосов
/ 11 июля 2020

Измените scala.math.pow на import org.apache.spark.sql.functions.pow. Это будет работать.

Проверьте код ниже.

scala> df.withColumn("New", df.columns.filter(_.contains("pct")).map(col(_)).reduceLeft((cur, next) => (next - cur) / pow(col("factor"),2))).show(false)
+---+-----+-----+-----+------+-------+
|key|pct1 |pct2 |pct3 |factor|New    |
+---+-----+-----+-----+------+-------+
|a  |0.1  |0.2  |0.3  |5     |0.01184|
|b  |0.1  |0.2  |0.3  |5     |0.01184|
+---+-----+-----+-----+------+-------+
...