如何创建键值RDD(Scala)

时间:2019-07-20 12:48:15

标签: scala apache-spark key rdd

我有以下类型的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的新手。

1 个答案:

答案 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,然后再继续。它将帮助您更快地了解和克服此类问题。