Ich habe ein sehr einfaches Spark-Programm (mit Flambo in Clojure, sollte aber leicht zu folgen sein). Dies sind alles Objekte auf der JVM. Ich teste auf einer local
Instanz (obwohl ich rate, dass Spark immer noch serialisiert und deserialisiert).Verwenden von JodaTime in Sparks groupByKey und countByKey
Eingabe ist eine RDD von vier Tupeln mit jeweils demselben Datumsobjekt. Die erste Map erzeugt eine Schlüsselwert-RDD von date => x.
Der Inhalt input
wird, wie erwartet:
=> (= dt dt)
true
=> (.hashCode dt)
1260848926
=> (.hashCode dt)
1260848926
Sie sind Fälle von JodaTime des DateTime, die implement equals as expected:
=> (f/foreach input prn)
[#<DateTime 2014-01-01T00:00:00.000Z> "A"]
[#<DateTime 2014-01-01T00:00:00.000Z> "B"]
[#<DateTime 2014-01-01T00:00:00.000Z> "C"]
[#<DateTime 2014-01-01T00:00:00.000Z> "D"]
Gerade klar, Gleichheit und .hashCode
Arbeit am Tag Objekt zu sein .
Wenn ich versuche, countByKey
, erhalte ich die erwartete:
=> (f/count-by-key by-date)
{#<DateTime 2014-01-01T00:00:00.000Z> 4}
Aber wenn ich groupByKey
, es scheint nicht zu funktionieren.
=> (f/foreach (f/group-by-key by-date) prn)
[#<DateTime 2014-01-01T00:00:00.000Z> ["A"]]
[#<DateTime 2014-01-01T00:00:00.000Z> ["B"]]
[#<DateTime 2014-01-01T00:00:00.000Z> ["C"]]
[#<DateTime 2014-01-01T00:00:00.000Z> ["D"]]
Die Tasten sind alle identisch, so würde ich das Ergebnis erwartet ein einzelner Eintrag mit dem Datum als Schlüssel und ["A", "B", "C", "D"]
als Wert zu sein. Etwas passiert, weil die Werte alle Listen sind.
Irgendwie entspricht groupByKey
nicht richtig den Schlüsseln. Aber countByKey
ist. Was ist der Unterschied zwischen den beiden? Wie kann ich sie dazu bringen, sich gleich zu verhalten?
Irgendwelche Ideen?
vielleicht könnten Sie Epoch Times in Millis-Darstellung anstelle von Datum/Uhrzeit-Objekten verwenden. Sieht nach der sichereren Alternative aus. Wir hatten Probleme, Daten mit anderen Hashes basierend auf dem Speicherort, wie Java-Enums, zu verschlüsseln. Sie funktionieren nicht in einer verteilten Umgebung. – maasg
Danke, das habe ich (glaube ich) mit Instant vorgeschlagen. Gut zu wissen, dass ich nicht der Einzige mit diesem Problem bin! – Joe
Verwenden Sie eine heterogene Mischung aus Chronologien und Zeitzonen innerhalb einer RDD? Wenn nicht, würde ich diese Informationen auf der RDD-Ebene beibehalten und den Speicherbedarf jedes Datensatzes speichern (wie Sie es mit "Instant" tun). – climbage