开始吧:
我有一个数据框( trainingDataFrame ),它来自一些空间数据。数据帧的每一行都有以下列:point_id(_c0),x_coord(_c1),y_coord(_c2),point_class(_c3)。
+---+---+---+---+
|_c0|_c1|_c2|_c3|
+---+---+---+---+
|1 |0.0|0.0|a |
|2 |0.0|1.0|a |
|3 |1.0|0.0|b |
|4 |3.0|4.0|b |
|5 |8.0|7.0|b |
|6 |4.0|9.0|b |
|7 |2.0|5.0|a |
|8 |1.0|9.0|a |
|9 |3.0|6.0|a |
|10 |8.0|2.0|c |
|11 |9.0|1.0|a |
|12 |2.0|7.0|c |
|13 |2.0|9.0|c |
|14 |2.0|4.0|b |
|15 |1.0|3.0|c |
|16 |4.0|6.0|c |
|17 |3.0|5.0|c |
|18 |5.0|3.0|a |
|19 |5.0|9.0|b |
|20 |8.0|9.0|c |
+---+---+---+---+
我创建了一个函数,该函数接受任意给定点的x_coord和y_coord并返回空间中特定点所属的单元格(有4个单元格)。
def icchId(X : Double, Y : Double, F_avgX: Double, F_avgY : Double) : Any = {
if(X < F_avgX && Y < F_avgY){
return "ICCH 1"
}
else if(X < F_avgX && Y >= F_avgY){
return "ICCH 2"
}
else if(X >= F_avgX && Y >= F_avgY){
return "ICCH 3"
}
else if(X > F_avgX && Y < F_avgY){
return "ICCH 4"
}
else
return 0
}
我的目标是创建一个RDD,使其每一行都具有以下形式:
[point_ICCHid] ( icchId函数返回值), [x_coord-y_coord] (键) , [point_class] (值)
point_ICCHid将由icchId函数提供。数据框中的x和y_coord以及每个点的类。
我的尝试如下所示:
val trainingRDD : RDD[Row] = trainingDataFrame.rdd.map(r => (icchId(r(1),r(2),avgX,avgY),(r(1),r(2),r(3))) )
但我收到此错误:
错误:类型不匹配;找到:任何要求:双 val trainingRDD:RDD [Row] = trainingDataFrame.rdd.map(r =>(icchId(r(1),r(2),avgX,avgY),(r(1),r(2),r(3) )))
请注意,我正在为此项目使用databricks社区版,并且我正在尝试将自定义函数传递给RDD的创建。
编辑:
根据有关类似问题的评论中给出的答案对RDD进行了一些调整之后,我在代码行中进行了以下编辑:
val trainingRDD : RDD[Row] = trainingDataFrame.rdd.map(r => r.icchId(1,2,avgX,avgY))
现在,我认为该错误比以前严重得多:
错误:值icchId不是org.apache.spark.sql.Row的成员