2016-04-29 10 views
0

ich eine andere Werte zwischen denselben Schlüssel vergleichen wollen:Vergleichen Werte zwischen denselben Schlüssel von der Karte in scala

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

ich zu vergleichen, ich versuche: Werte zwischen Key Robert: 2010/01/02 & 2011/20.02

kann mir jemand vorschlagen, wie ich

mit reducebykey erreichen können

Antwort

0

Sie können nicht mehrere Werte zu einem einzigen Schlüssel zuordnen Map verwenden.

Sie müssen eine veränderbare Map[K, Set[V]] verwenden und die MultiMap-Eigenschaft dann unter Verwendung der addBinding-Methode mischen.

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

Wenn Sie tun, dass Sie die Werte direkt an der Hand haben.

+0

Ich bin in der Lage, den Wert zuzuweisen, finden Sie die folgende Antwort: val docsss = rows.map (r => (r (2), r (1)) docsss.foreach (println) (11,3 April 2010) 11 ist Schlüsselwert = "3. April 2010" (11.14 Mai 2011) 11 ist Schlüsselwert = "14. Mai 2011" Das Problem ist, wenn ich dies zu reducebykey nehme erlaubt nur Wert als int, aber ich Ich versuche, eine Zeichenfolge als Wert zu nehmen für zB: ("3 April 2010", "14 Mai 2011") – jk7

0

ich in der Lage bin, den Wert zuweisen, bitte die unten stehende Antwort finden: val docsss = rows.map (r => (r (2), R (1)) docsss.foreach (println)

(11,3 April 2010) 11 ist Schlüsselwert = "3 April 2010" (11,14 Mai 2011) 11 ist Schlüsselwert = "14 Mai 2011"

Das Problem ist, wenn ich dies zu reducebykey nehme nur Wert als int zulassen, aber ich versuche, eine Zeichenfolge als Wert zu nehmen für zB: ("3 April 2010", "14 Mai 2011")

0

Cl Anfang Tasten String s zu sein, ist kein Problem, wie man es von PairRddFunctions Unterschrift sehen können:

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

Tasten kann jede Art sein.

Ich habe noch einfacher Test um dies zu überprüfen:

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

Ergebnisse:

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

Bitte geben Sie einige weitere Details über Ihren Code, nämlich:

  1. Typen von Ihrem RDD s
  2. komplettere Code-Schnipsel von dem, was
  3. Fehlermeldung nicht funktioniert, die Sie
  4. aufwendig auf, was Sie unter „verschiedene Werte vergleichen“ haben.Vielleicht besser so etwas wie groupByKey wird hier fit

Aktualisiert Beispiel:

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) 

Ergebnis ist:

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

Ich verwende groupByKey zu Gruppendatensätzen mit dem gleichen Schlüssel in iterator, dann in flatMap es Erator wird in Array gepuffert, nach der Regel validiert (Länge> 3 und größte Differenz in Tagen ist> 10) und dann, wenn der aktuelle Schlüssel den Regeln entspricht, werden alle Datensätze mit diesem Schlüssel in den ursprünglichen Zustand zurückversetzt.

Auch wenn ich Ihre Anforderungen nicht vollständig verstanden habe, hoffe ich, dass Sie das Beispiel entsprechend Ihren Bedürfnissen ändern können.

+0

meine Geschäftslogik ist: Ich habe 3 Datensätze in einer Datei 1) Schlüssel ist Transaktions-ID und Wert ist Transaktionsdatum Record 1 (Key: T1 Value: 02.02.2015) Record 2 (Key: T2 Value: 2015/03/02) Record3 (Key: T1 Value: 2015/02/15) wenn ich den Datensatz Key T1, es gibt 2 Daten damit verbunden. Ich möchte die Werte vergleichen (02.02.2015, 15.02.2015). – jk7

+0

@ jk7, haben Sie nur drei Datensätze in der Datei? Verwenden Sie Spark, um diese Datei zu analysieren? Wie viele Dateien hast du? Was ist mit anderen Fragen, die ich gestellt habe? – Aivean

+0

Ich verwende Spark, um die Datei zu analysieren. Ich ziehe die Daten aus der Avro-Tabelle mit Datenrahmen und konvertieren in RDD. Ich gab nur 3 Rekord als Beispiel. Die Datei wird einen riesigen Rekord haben. – jk7

Verwandte Themen