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制限を超えてエラーを回避する方法。誰か助けてくれますか?
あなたの配列の大きさはどれですか?それらをハッシュで置き換えるのは理にかなっていますか? – maasg