2016-09-28 80 views
1

我想使用Array [Byte]作爲RDD的Key。例如:如何在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聯接操作,但總是讓resultRdd.count()= 0。

所以我試圖序列化數組[字節]和它工作正常,因爲我想看到,只爲小數據集。

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(k))的存在的。

如何避免GC限制超過錯誤。有人幫我嗎?

+1

你的數組有多大?將它們替換爲散列是否合理? – maasg

回答

1

您可以使用數組的內置scala包裝,WrappedArray[Byte]。通過使用toSeq方法可以將數組轉換爲WrappedArray。 WrappedArray已經正確實施了equalshashCode,所以具有相同元素的兩個不同陣列被認爲是相等的。

scala> val a = Array(1,2,3,4,5) 
a: Array[Int] = Array(1, 2, 3, 4, 5) 

scala> val b = Array(1,2,3,4,5) 
b: Array[Int] = Array(1, 2, 3, 4, 5) 

scala> a == b 
res0: Boolean = false 

scala> a.toSeq 
res1: Seq[Int] = WrappedArray(1, 2, 3, 4, 5) 

scala> a.toSeq == b.toSeq 
res2: Boolean = true 
相關問題