我有以下类型的RDD(名称:AllTrainingDATA_RDD) org.apache.spark.rdd.RDD [(String,Double,Double,String)] :
DEFAULT = ...
def f(arg = None):
arg = arg or DEFAULT
...
第一列: ICCH_ID ,第二列: X_Coordinates ,第三列: Y_Coordinates ,第四列: Class
我想得到一个RDD,其中的第二和第三列为键,而第四列为值。 ICCH_ID列应保留在RDD中。
我目前基于互联网研究的尝试是:
(ICCH_1,4.3,3.0,Iris-setosa)
(ICCH_1,4.4,2.9,Iris-setosa)
(ICCH_1,4.4,3.0,Iris-setosa)
(ICCH_2,4.4,3.2,Iris-setosa)
但是我收到此错误:
错误:值拆分不是(String,Double,Double,String)的成员
P.S。我正在使用Databricks社区版。我是Scala的新手。
答案 0 :(得分:2)
让我们尝试逐步分解您的解决方案:
val AllTrainingDATA_RDD_Final = AllTrainingDATA_RDD
.map(_.split(","))
.keyBy(_(X_COORD,Y_COORD))
.mapValues(fields => ("CLASS"))
.groupByKey()
.collect()
您的第一个问题是使用.map(_.split(","))
。这可能是在RDD[String]
上进行的预处理阶段,以从文本输入行提取逗号分隔的值。但是,既然您已经完成了此操作,我们可以继续删除该部分。
您的第二个问题将来自.keyBy(_(X_COORD,Y_COORD))
,它将看起来像这样:
错误:(字符串,双精度型,双精度型,字符串)没有参数
这是因为您提供了keyBy
一个匿名函数,该函数试图将(X_COORD,Y_COORD)
应用于RDD中的每个元组,但是您真正想要的是提取x和y坐标的函数(第二个和第三个值)。一种实现此目标的方法是.keyBy{case (_, x, y, _) => (x, y)}
最后,您使用mapValues
只会为RDD中的所有元素产生相同的字符串值("CLASS")
。取而代之,您可以像这样简单地将元组中的第4个值作为:.mapValues(_._4)
将所有内容放在一起,您将获得以下代码:
val AllTrainingDATA_RDD_Final = AllTrainingDATA_RDD
.keyBy{case (_, x, y, _) => (x, y)}
.mapValues(_._4)
.groupByKey()
.collect()
由于您是Scala的新手,因此建议您花一些时间来熟悉语法,功能和API,然后再继续。它将帮助您更快地了解和克服此类问题。