2017-07-17 11 views
0

spark Dataframeの列間で複雑な計算を行うには?たとえば

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") 
               ^

複合体を実装する方法は?

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

、あなたが良いでしょう:

答えて

0

pow()は、Double型の引数を2つ取ります。

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

は、次の例のように、第二引数は、問題を修正する必要があります提供:私はあなたが2番目の引数が不足していると信じて

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| 
+---+---+------------------+ 
+0

精度を制御する方法は?例:2.4197530864197523から2.41975への変換。 –

+0

精度を第2引数として 'round()'だけを使用してください。前の例を使用して、 'round(pow(calresult1.col(" _ 4 ")+(calresult1.col(" _ 3 "))、2.0)、5)'は望ましい精度を与えます。 –

0

ジャスト組み込み関数を使用します。

通常、UserDefinedFunctionsを使用できますが、ここでは必要ありません。

関連する問題