Wie partition RDD durch Schlüssel in der Funke?
Gegeben, dass die HashPartitioner docs sagen:
[HashPartitioner] implementiert eine hash-basierte Partitionierung mit Java
Objekt.hashCode.
Sagen, ich will die partition DeviceData
durch seine kind
.
case class DeviceData(kind: String, time: Long, data: String)
Ist es richtig zu partition eine RDD[DeviceData]
durch überschreiben der deviceData.hashCode()
Methode, und verwenden Sie nur den hashcode von kind
?
Aber angesichts der Tatsache, dass HashPartitioner
nimmt eine Reihe von Partitionen-parameter bin ich verwirrt, ob ich wissen muss, um die Zahl der Arten im Voraus und was passiert, wenn es mehr Arten als Partitionen?
Ist es korrekt, dass wenn ich Schreibe partitioniert Daten auf der Festplatte erhalten bleiben partitioniert, wenn Sie Lesen?
Mein Ziel ist zu nennen,
deviceDataRdd.foreachPartition(d: Iterator[DeviceData] => ...)
Haben und nur DeviceData
's von der gleichen kind
Wert im iterator.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie über nur tun, eine
groupByKey
mitkind
. Oder ein anderesPairRDDFunctions
Methode.Sie machen es scheint mir, dass Sie nicht wirklich über die Partitionierung, nur, dass Sie alle von einer bestimmten Art in einem verarbeitungsablauf?
Die paar Funktionen, die dies ermöglichen:
Allerdings können Sie wahrscheinlich ein wenig sicherer mit so etwas wie:
oder
mapValues
oder eine Reihe von das andere paar Funktionen, die gewährleisten, erhalten Sie die Stücke als ganzesWäre es nicht. Wenn Sie an der Java -
Object.hashCode
Dokumentation finden Sie folgende Informationen zum Allgemeinen Vertrag für diehashCode
:So, es sei denn, Vorstellung der Gleichheit basiert rein auf einem
kind
Gerät passt auf Ihren Fall, und ich bezweifle ernsthaft, tut es, basteln mitHashCode
um die gewünschte Partitionierung ist eine schlechte Idee. Im Allgemeinen Fall sollten Sie implementieren Sie Ihre eigenen Partitionierer aber hier ist es nicht nötig.Da, ohne spezielle Szenarien in SQL und GraphX,
partitionBy
ist nur gültig aufPairRDD
macht es Sinn, zu erstellenRDD[(String, DeviceData)]
und verwenden nurHashPartitioner
Nur im Hinterkopf behalten, dass in einer situation, wo
kind
hat eine niedrige Kardinalität oder stark schiefe Verteilung Verwendung für die Partitionierung nicht die optimale Lösung.