Я хочу использовать Array [Byte] как ключ от RDD. Например:Как использовать массив байтов в качестве ключа в RDD?
val rdd1:RDD[((Array[Byte]), (String, Int)] = from src rdd
val rdd2:RDD[((Array[Byte]), (String, Int)] = from dest rdd
val resultRdd = rdd1.join(rdd2)
Я хочу, чтобы выполнить операцию соединения на rdd1 и rdd2 с помощью Array [Byte] как Key но всегда получать resultRdd.count() = 0.
Так что я попытался сериализовать массив [Byte] и работает отлично, как я хочу видеть, только для небольшого набора данных.
val serRdd1= rdd1.map { case (k,v) => (new SerByteArr(k), v) }
val serRdd2= rdd2.map { case (k,v) => (new SerByteArr(k), v) }
class SerByteArr(val bytes: Array[Byte]) extends Serializable {
override val hashCode = bytes.deep.hashCode
override def equals(obj:Any) = obj.isInstanceOf[SerByteArr] && obj.asInstanceOf[SerByteArr].bytes.deep == this.bytes.deep
}
Для большого набора данных, получение java.lang.OutOfMemoryError: GC предела накладных превышен, Проблемы является встречающейся в создании объекта (новый SerByteArr (к)).
Как избежать предела GC превышают ошибку. Кто-нибудь мне помогает?
Насколько велики ваши массивы? Было бы разумно заменить их хешем? – maasg