比较scala中map中相同键之间的值

时间:2016-04-29 19:05:48

标签: scala apache-spark

我想比较同一个键之间的不同值:

map("Robert" , "2010/01/02" , "John" , "2011/02/02" , "Robert" , "2011/02/20")

我想比较一下: Key Robert:2010/01/02& 2011/02/20

有人可以建议我如何使用reducebykey

3 个答案:

答案 0 :(得分:0)

您无法使用Map为单个键指定多个值。

您必须使用可变Map[K, Set[V]]并混合使用MultiMap特征,然后使用addBinding方法。

请参阅http://www.scala-lang.org/api/current/?_ga=1.225433690.1332072044.1457439940#scala.collection.mutable.MultiMap

如果你这样做,你就掌握了价值。

答案 1 :(得分:0)

我可以分配值,请找到以下答案: val docsss = rows.map(r =>(r(2),r(1)) docsss.foreach(的println)

(2010年4月11日至3日)11是关键值=“2010年4月3日” (2011年5月11日,11日)11是关键值=“2011年5月14日”

问题是当我把它带到reducebykey时它只允许将值作为int,但我试图将一个字符串作为值。 例如:(“2010年4月3日”,“2011年5月14日”)

答案 2 :(得分:0)

显然,String的密钥不是问题,您可以从PairRddFunctions签名中看到:

 class PairRDDFunctions[K, V](self: RDD[(K, V)])(implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null)

键可以是任何类型。

我甚至创建了简单的测试来检查:

val r = sc.parallelize(Seq("Robert" -> "2010/01/02" , "John" -> "2011/02/02" , "Robert" -> "2011/02/20"))
r.reduceByKey(_ + " " +_).foreach(println)

结果:

(John,2011/02/02)
(Robert,2010/01/02 2011/02/20)

请提供有关您的代码的更多详细信息,例如:

  1. RDD s
  2. 的类型
  3. 更完整的代码片段
  4. 您有错误消息
  5. 通过“比较不同的价值观”阐述你的意思。也许像groupByKey这样的东西会更适合
  6. 更新示例:

    import java.time.LocalDate
    import java.time.temporal.ChronoUnit
    import java.time.format.DateTimeFormatter
    
    def parseDate(d:String) =
      LocalDate.parse(d,
        DateTimeFormatter.ofPattern("yyyy/MM/dd"))
    
    // ChronoUnit.DAYS.between(d1, d2)
    
    
    val r = sc.parallelize(Seq("Robert" -> "2010/01/02" , "John" -> "2011/02/02" , "Robert" -> "2011/02/20",
      "Robert" -> "2011/02/20"))
    
    implicit def localDateOrdering = Ordering.by[LocalDate, Long](_.toEpochDay)
    
    r.groupByKey.flatMap {
      case (key, vals) =>
        val valsArr = vals.toArray
        valsArr.map(parseDate) match {
          case x if x.length >= 3 && ChronoUnit.DAYS.between(x.min, x.max) > 10 =>
            valsArr.map(key -> _)
          case _ => Nil
        }
    }.foreach(println)
    

    结果是:

    (Robert,2010/01/02)
    (Robert,2011/02/20)
    (Robert,2011/02/20)
    

    我正在使用groupByKey将具有相同密钥的记录分组到iterator,然后在flatMap中将迭代器缓存在Array中,并根据规则进行验证(长度> ; 3和最大天数差异> 10)然后,如果当前密钥符合规则,则具有该密钥的所有记录将恢复到原始状态。

    即使我没有完全理解您的要求,我希望您可以根据自己的需要修改该示例。