如何在spark Dataframe中的列之间进行一些复杂的计算?

时间:2017-07-17 01:00:48

标签: scala apache-spark

例如:

val calresult1 = indexedresult.withColumn("_4", lit(1))
calresult1.show()
+---+---+------------------+---+
| _1| _2|                _3| _4|
+---+---+------------------+---+
|  5|  2|               5.0|  1|
|  5|  0|0.5555555555555554|  1|
|  4|  0| 3.222222222222222|  1|
|  3|  5|               1.0|  1|
......

我可以使用+, - ,*,/:

进行一些简单的计算
val calresult2 = calresult1.withColumn("_5", calresult1.col("_4")/(calresult1.col("_3"))).select("_1","_2","_5")
calresult2.show()
+---+---+------------------+
| _1| _2|                _5|
+---+---+------------------+
|  5|  2|               0.2|
|  5|  0|1.8000000000000007|
|  4|  0|               1.0|
......

但不能使用pow和sqrt:

    val calresult2 = calresult1.withColumn("_5", pow(calresult1.col("_4")+(calresult1.col("_3")))).select("_1","_2","_5")
calresult2.show()

错误:

Error:(414, 53) could not find implicit value for parameter impl: breeze.numerics.pow.Impl[org.apache.spark.sql.Column,VR]
val calresult2 = calresult1.withColumn("_5", pow(calresult1.col("_4")+(calresult1.col("_3")))).select("_1","_2","_5")
                                                ^

如何实施复杂的公式?

2 个答案:

答案 0 :(得分:0)

只需使用内置功能:

import org.apache.spark.sql.functions.{pow, sqrt}

你会很好。

一般情况下,您可以使用UserDefinedFunctions,但此处不需要。

答案 1 :(得分:0)

pow()接受2个Double类型的参数。我相信你错过了第二个论点:

pow(calresult1.col("_4")+(calresult1.col("_3")))

如下例所示提供第二个参数应解决问题:

import org.apache.spark.sql.functions._

val calresult2 = calresult1.withColumn(
  "_5", pow(calresult1.col("_4")+(calresult1.col("_3")), 2.0)
).select(
  "_1","_2","_5"
).show

+---+---+------------------+
| _1| _2|                _5|
+---+---+------------------+
|  5|  2|              36.0|
|  5|  0|2.4197530864197523|
|  4|  0|17.827160493827154|
|  3|  5|               4.0|
+---+---+------------------+