【问题标题】:Custom ordering for sorting in rdd sparkrdd spark中排序的自定义排序
【发布时间】:2016-05-07 01:17:07
【问题描述】:

我有一个 (String, Long, Int, String, String,List[Integer], String, String, String, Long, Long) 的 rdd。我想按元组中的所有字段对其进行排序 也就是说,如果 _._1 相等,则移动到 _._2,否则返回第一次比较的结果。像这样我想继续到元组中的最后一个元素。

下面的解决方案看起来太笨拙了。有没有更好的方法在 scala 中做到这一点?

我正在尝试的是这样的

val customOrdering = new Ordering[(String, Long, Int, String, String,
      List[Integer], String, String, String, Long, Long)] {
      override def compare(a: (String, Long, Int, String, String,
        List[Integer], String, String, String, Long, Long),
                           b: (String, Long, Int, String, String,
                             List[Integer], String, String, String, Long, Long)) = {


        if (a._1.compare(b._1) == 0) {
          if(a._2 == a._2){
            ...

          }
          else if(a._2 < a._2) {
              1
            }
          else{
            0
          }
        }
        else if(a._1.compare(b._1) < 0 ){
          1
        }
        else {
          0
        }
      }
    }

【问题讨论】:

  • 你想对列表做什么?
  • 您也在比较不相关的类型。字符串和长。这种比较的目的是什么?
  • 你如何比较List[Integer]
  • 我也想按升序一一比较列表元素。该列表将始终包含两个元素。
  • 是的,我正在比较不相关的数据类型。

标签: scala


【解决方案1】:

我会尝试一种方法,将元组转换为序列,压缩它们,然后获取比较非零的第一个项目。

应该是这样的:

first.productIterator.toSeq.zip(second.productIterator.toSeq).find(
  {case (x, y) => x.compare(y) != 0}
) match {
  case Some(tuple) => {
     if (tuple._1.compare(tuple._2) < 0) 1 else 0
  }
  case None => ???
}

【讨论】:

  • 我认为你应该为那些没有实现它的类型实现隐式方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2016-08-26
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2017-11-06
相关资源
最近更新 更多