Spark Rdd-将sortBy与多个列值一起使用

时间:2019-04-25 12:15:22

标签: scala apache-spark rdd

将我的数据集分组后,它看起来像这样

(AD_PRES,1)
(AD_VP,2)
(FI_ACCOUNT,5)
(FI_MGR,1)
(IT_PROG,5)
(PU_CLERK,5)
(PU_MAN,1)
(SA_MAN,5)
(ST_CLERK,20)
(ST_MAN,5)

在这里,我想按键排序,降序排序,值按升序排序。因此请尝试以下代码行。

 emp_data.map(s => (s.JOB_ID, s.FIRST_NAME.concat(",").concat(s.LAST_NAME))).groupByKey().map({
    case (x, y) => (x, y.toList.size)
  }).sortBy(s => (s._1, s._2))(Ordering.Tuple2(Ordering.String.reverse, Ordering.Int.reverse))

这是导致以下异常的原因。

not enough arguments for expression of type (implicit ord: Ordering[(String, Int)], implicit ctag: scala.reflect.ClassTag[(String, Int)])org.apache.spark.rdd.RDD[(String, Int)]. Unspecified value parameter ctag.

1 个答案:

答案 0 :(得分:3)

RDD.sortBy将顺序标签和类标签都作为隐式参数。

def sortBy[K](f: (T) ⇒ K, ascending: Boolean = true, numPartitions: Int = this.partitions.length)(implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T] 

您不能仅提供这些子集并期望一切正常。相反,您可以提供块局部隐式排序:

{ 
   implicit val ord = Ordering.Tuple2[String, Int](Ordering.String.reverse, Ordering.Int.reverse)
   emp_data.map(s => (s.JOB_ID, s.FIRST_NAME.concat(",").concat(s.LAST_NAME))).groupByKey().map({
     case (x, y) => (x, y.toList.size)
   }).sortBy(s => (s._1, s._2))
}

尽管在这种情况下,您应该真正使用reduceByKey而不是groupByKey