如何在RDD中使用字节数组作为键?

时间:2016-09-28 17:51:18

标签: java scala apache-spark garbage-collection

我想使用Array [Byte]作为RDD的Key。例如:

library(penalized)
set.seed(1)
x1 = rnorm(100)*10
x2 = rnorm(100)*10
x3 = rnorm(100)*10
y = sin(x1) + cos(x2) - x3 + rnorm(100)

data <- data.frame(y, x1, x2, x3)

win <- 10

coefs <- matrix(NA, ncol=4, nrow=length(y))

for(i in 1:(length(y)-win)) {
  d <- data[(1+i):(win+i),]
  p <- win + i
  pen <- penalized(y, ~ x1 + x2 + x3, ~1, lambda1 = 0, lambda2 = 0,
                   positive = c(F, F, T), data = data)
  beta <- coef(pen, which = "all")
  coefs[p,] <- unname(beta)
  }

我想使用Array [Byte]作为Key在rdd1和rdd2上执行连接操作 但总是得到resultRdd.count()= 0.

所以我尝试序列化数组[Byte]并且它正常工作,因为我想看到,仅适用于小型数据集。

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)

对于大型数据集,获取java.lang.OutOfMemoryError:超出GC开销限制, 创建对象时出现问题(新的SerByteArr(k))。

如何避免GC限制超出错误。有人帮帮我吗?

1 个答案:

答案 0 :(得分:2)

您可以对数组WrappedArray[Byte]使用内置的scala包装器。可以使用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