Spark键/值过滤器功能

the*_*ing 1 scala apache-spark

我在Key Value配对中有数据.我试图将过滤函数应用于看起来像这样的数据:

  def filterNum(x: Int) : Boolean = {
    if (decimalArr.contains(x)) return true
    else return false
  }
Run Code Online (Sandbox Code Playgroud)

我的Spark代码有:

val numRDD = columnRDD.filter(x => filterNum(x(0)))
Run Code Online (Sandbox Code Playgroud)

但那不会工作,当我发送:

val numRDD = columnRDD.filter(x => filterNum(x))
Run Code Online (Sandbox Code Playgroud)

我收到错误:

<console>:23: error: type mismatch;
 found   : (Int, String)
 required: Int
       val numRDD = columnRDD.filter(x => filterNum(x))
Run Code Online (Sandbox Code Playgroud)

我也试图做其他事情,比如改变函数的输入

Jus*_*ony 8

这是因为RDD.filter传入Key-Value Tuple,(Int, String)并且filterNum期望a Int,这就是第一次尝试的原因:tuple(index)拉出元组的索引处的值.

您可以将过滤器功能更改为

def filterNum(x: (Int, String)) : Boolean = {
  if (decimalArr.contains(x._1)) return true
  else return false
}
Run Code Online (Sandbox Code Playgroud)

虽然,我个人会做一个更简洁的版本,因为假的被烘焙到contains你可以直接使用表达式:

columnRDD.filter(decimalArr.contains(_._1))
Run Code Online (Sandbox Code Playgroud)

或者,如果您不喜欢下划线语法:

columnRDD.filter(x=>decimalArr.contains(x._1))
Run Code Online (Sandbox Code Playgroud)

另外,不要return在scala中使用,最后评估的行是自动返回