如何在spark中将元素插入到rdd数组中

时间:2016-12-05 10:39:23

标签: arrays scala apache-spark rdd

您好我尝试使用spark中的scala将元素插入到rdd数组[String]。

这是一个例子。

val data =  RDD[Array[String]] = Array(Array(1,2,3), Array(1,2,3,4), Array(1,2)).

我希望在此数据中生成所有数组的长度为4。

如果数组的长度小于4,我想填充数组中的NULL值。

这是我试图解决的代码。

val newData = data.map(x => 
    if(x.length < 4){
        for(i <- x.length until 4){
        x.union("NULL") 
        }
    }
    else{
        x
    }
)

但结果是Array[Any] = Array((), Array(1, 2, 3, 4), ())

所以我尝试了另一种方式。我使用了yield for for循环。

val newData = data.map(x => 
    if(x.length < 4){
        for(i <- x.length until 4)yield{
        x.union("NULL") 
        }
    }
    else{
        x
    }
)

结果为Array[Object] = Array(Vector(Array(1, 2, 3, N, U, L, L)), Array(1, 2, 3, 4), Vector(Array(1, 2, N, U, L, L), Array(1, 2, N, U, L, L)))

这些不是我想要的。我想像这样回来

RDD[Array[String]] = Array(Array(1,2,3,NULL), Array(1,2,3,4), Array(1,2,NULL,NULL)).

我该怎么办? 有没有办法解决它?

1 个答案:

答案 0 :(得分:1)

我使用以下代码解决了您的用例:

val initialRDD = sparkContext.parallelize(Array(Array[AnyVal](1, 2, 3), Array[AnyVal](1, 2, 3, 4), Array[AnyVal](1, 2, 3)))
val transformedRDD = initialRDD.map(array =>
  if (array.length < 4) {
    val transformedArray = Array.fill[AnyVal](4)("NULL")
    Array.copy(array, 0, transformedArray, 0, array.length)
    transformedArray
  } else {
    array
  }
)
val result = transformedRDD.collect()