Comment partition de RDD par clé dans l'Allumage?
Étant donné que la HashPartitioner docs disent:
[HashPartitioner] met en œuvre de hachage basée sur le partitionnement à l'aide de Java
Objet.hashCode.
Dire que je veux partition DeviceData
par son kind
.
case class DeviceData(kind: String, time: Long, data: String)
Serait-il correct de la partition RDD[DeviceData]
par l'écrasement de la deviceData.hashCode()
méthode et l'utilisation que le hashcode de kind
?
Mais étant donné que HashPartitioner
prend un certain nombre de partitions paramètre je suis confus quant à savoir si j'ai besoin de savoir le nombre de types à l'avance et qu'advient-il si il existe plusieurs types de partitions?
Est-il exact que si j'écris des données partitionnées sur le disque, il restera partitionné lors de la lecture?
Mon but est d'appeler
deviceDataRdd.foreachPartition(d: Iterator[DeviceData] => ...)
Et ont seulement DeviceData
's de la même kind
de la valeur de l'itérateur.
Vous devez vous connecter pour publier un commentaire.
Comment faire juste un
groupByKey
à l'aide dekind
. Ou une autrePairRDDFunctions
méthode.Vous faites, il me semble que vous n'avez pas vraiment sur le partitionnement, c'est juste que vous obtenez tout d'un genre spécifique dans un flux de traitement?
La paire de fonctions de permettre cela:
Cependant, vous pouvez probablement être un peu plus sûr avec quelque chose de plus comme:
ou
mapValues
ou un certain nombre d'autres fonctions paire qui vous garantissons que vous obtenir les pièces ensembleIl ne serait pas. Si vous prenez à la Java
Object.hashCode
de la documentation que vous trouverez les informations suivantes sur les conditions générales du contrat dehashCode
:Donc, à moins que la notion de l'égalité fondée uniquement sur une
kind
de l'appareil s'adapte à votre cas d'utilisation, et je doute sérieusement qu'il n', bricoler avecHashCode
à désiré partitionnement est une mauvaise idée. Dans le cas général, vous devriez mettre en place votre propre programme de partitionnement mais ici, il n'est pas nécessaire.Depuis, à l'exclusion spécialisé scénarios en SQL et GraphX,
partitionBy
est valable uniquement surPairRDD
il est logique de créerRDD[(String, DeviceData)]
et l'utilisation de la plaineHashPartitioner
Il suffit de garder à l'esprit que, dans une situation où
kind
a faible cardinalité ou très inégale répartition de l'utiliser pour le partitionnement peut être pas une solution optimale.