Estendendosi ulteriormente dall'osservazione di @aaronman, è possibile ovviare a questo problema. Sul RDD, Ci sono due definizioni per distinct
:
/**
* Return a new RDD containing the distinct elements in this RDD.
*/
def distinct(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] =
map(x => (x, null)).reduceByKey((x, y) => x, numPartitions).map(_._1)
/**
* Return a new RDD containing the distinct elements in this RDD.
*/
def distinct(): RDD[T] = distinct(partitions.size)
È evidente dalla firma del primo distinct
che ci deve essere un ordinamento implicito degli elementi e si presume nullo se assente, che è ciò che il la versione breve .distinct()
fa.
Non c'è Ordinamento predefinito implicito per classi case, ma è facile da implementare uno:
case class Person(name:String,tel:String) extends Ordered[Person] {
def compare(that: Person): Int = this.name compare that.name
}
Ora, provando lo stesso esempio fornisce i risultati attesi (si noti che sto paragonando i nomi):
val ps5 = Array(Person("peter","138"),Person("peter","55"),Person("john","138"))
sc.parallelize(ps5).distinct.collect
res: Array[P5] = Array(P5(john,111), P5(peter,139))
Si noti che le classi di casi implementano già equals
e hashCode
, quindi l'impl sull'esempio fornito non è necessario e non è corretto. La firma corretta per equals
è: equals(arg0: Any): Boolean
- BTW, per prima cosa ho pensato che il problema riguardava la firma equals errata, che mi ha mandato a cercare nel percorso sbagliato.
Mi chiedo se ha qualcosa a che fare con "Peter" non essere lo stesso di " Perter "? – kviiri
Quanto tempo hai dedicato a esaminare il problema prima di pubblicarlo? Cosa ti aspetti da questo test? – maasg
Segnalato per chiusura in quanto sembra essere causato da un semplice errore tipografico. – kviiri