例如:
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")
^
如何实施复杂的公式?
答案 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|
+---+---+------------------+