2016-09-28 4 views
1

RDDのキーとしてArray [Byte]を使いたいです。たとえば: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は、だから私は、Arrayをシリアル化しようとしました[Byte]そして私が見たいと思っているようにうまくいきます。小さなDatasetの場合にのみです。大規模なデータセットについて

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

配列には、組み込みのスカラーラッパー、WrappedArray[Byte]を使用できます。配列はtoSeqメソッドを使用してWrappedArrayに変換できます。 WrappedArrayはequalshashCodeを正しく実装しているため、同じ要素を持つ2つの異なる配列が等しいとみなされます。

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 
関連する問題