考虑这些重载的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)
答案 0 :(得分:1)
由于这是类型参数T
,K
的通用方法,因此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
,类似于上述方法。