我想比较同一个键之间的不同值:
map("Robert" , "2010/01/02" , "John" , "2011/02/02" , "Robert" , "2011/02/20")
我想比较一下: Key Robert:2010/01/02& 2011/02/20
有人可以建议我如何使用reducebykey
答案 0 :(得分:0)
您无法使用Map
为单个键指定多个值。
您必须使用可变Map[K, Set[V]]
并混合使用MultiMap特征,然后使用addBinding
方法。
如果你这样做,你就掌握了价值。
答案 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)
请提供有关您的代码的更多详细信息,例如:
RDD
s groupByKey
这样的东西会更适合更新示例:
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)然后,如果当前密钥符合规则,则具有该密钥的所有记录将恢复到原始状态。
即使我没有完全理解您的要求,我希望您可以根据自己的需要修改该示例。