将函数传递到RDD的创建中

时间:2019-05-18 19:29:55

标签: scala function apache-spark dataframe rdd

开始吧:

我有一个数据框( 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的成员

0 个答案:

没有答案