首页 > 解决方案 > 提供代码块作为多个方法参数之一

问题描述

考虑这些重载 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)

顺便说一句,这是一种可行的方法..但我正在寻找内联语法

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

标签: scala

解决方案


由于这是一个带有类型参数的泛型方法TKScala 有时无法从上下文中推断出它们应该是什么类型。在这种情况下,您可以通过提供如下类型注释来帮助它:

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上述方法。


推荐阅读