提供代码块作为多个方法参数之一

时间:2018-06-11 02:46:27

标签: scala

考虑这些重载的groupBy签名:

  def groupBy[K](f: T => K)(implicit kt: ClassTag[K]): RDD[(K, Iterable[T])] = withScope {
    groupBy[K](f, defaultPartitioner(this))
  }

  def groupBy[K](
      f: T => K,
      numPartitions: Int)(implicit kt: ClassTag[K]): RDD[(K, Iterable[T])] = withScope {
    groupBy(f, new HashPartitioner(numPartitions))
  }

前者的 正确/工作 调用如下:

val groupedRdd = df.rdd.groupBy{ r => r.getString(r.fieldIndex("centroidId"))}

但我无法确定如何添加第二个参数。这是明显的尝试 - 它提供语法错误

val groupedRdd = df.rdd.groupBy{ r => r.getString(r.fieldIndex("centroidId")), 
nPartitions}

我也曾尝试过(还有语法错误):

val groupedRdd = df.rdd.groupBy({ r => r.getString(r.fieldIndex("centroidId"))},
 nPartitions)

btw这是的方法..但我正在寻找内联语法

def  func(r: Row)  = r.getString(r.fieldIndex("centroidId"))
val groupedRdd = df.rdd.groupBy( func _, nPartitions)

1 个答案:

答案 0 :(得分:1)

由于这是类型参数TK的通用方法,因此Scala有时无法从上下文推断出应该是哪些类型。在这种情况下,您可以通过提供类似的类型注释来帮助它:

df.rdd.groupBy({ r: Row => r.getString(r.fieldIndex("centroidId")) }, nPartitions)

这也是这种方法有效的原因:

def func(r: Row)  = r.getString(r.fieldIndex("centroidId"))
val groupedRdd = df.rdd.groupBy(func _, nPartitions)

这会将r的类型修改为Row,类似于上述方法。