Arrays 如何在spark中向rdd数组插入元素

Arrays 如何在spark中向rdd数组插入元素,arrays,scala,apache-spark,rdd,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,我希望填充数组中的空值 这是我试图解决的代码 val newData = data.map(x => if(x.length < 4){ f

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

下面是一个例子

val data =  RDD[Array[String]] = Array(Array(1,2,3), Array(1,2,3,4), Array(1,2)).
我想将此数据中所有数组的长度设为4

如果数组的长度小于4,我希望填充数组中的空值

这是我试图解决的代码

val newData = data.map(x => 
    if(x.length < 4){
        for(i <- x.length until 4){
        x.union("NULL") 
        }
    }
    else{
        x
    }
)
结果是
Array[Object]=数组(向量(数组(1,2,3,N,U,L,L)),数组(1,2,3,4),向量(数组(1,2,N,U,L,L),数组(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))。

我该怎么办?
是否有解决方法?

union是一种功能性操作,它不会更改数组
x
。不过,您不需要对循环执行此操作,而且任何循环实现都可能会比较慢——最好创建一个包含所有空值的新集合,而不是每次添加空值时都对某些内容进行修改。这里有一个lambda函数,应该适合您:

def fillNull(x: Array[Int], desiredLength: Int): Array[String] = {
  x.map(_.toString) ++ Array.fill(desiredLength - x.length)("NULL") 
}

val newData = data.map(fillNull(_, 4))

union
是一种功能性操作,它不会更改数组
x
。不过,您不需要对循环执行此操作,而且任何循环实现都可能会比较慢——最好创建一个包含所有空值的新集合,而不是每次添加空值时都对某些内容进行修改。这里有一个lambda函数,应该适合您:

def fillNull(x: Array[Int], desiredLength: Int): Array[String] = {
  x.map(_.toString) ++ Array.fill(desiredLength - x.length)("NULL") 
}

val newData = data.map(fillNull(_, 4))

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

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()
val initialRDD=sparkContext.parallelize(数组(数组[AnyVal](1,2,3)、数组[AnyVal](1,2,3,4)、数组[AnyVal](1,2,3)))
val transformeddd=initialRDD.map(数组=>
if(数组长度<4){
val transformedArray=Array.fill[AnyVal](4)(“NULL”)
复制(数组,0,transformedArray,0,Array.length)
变换阵列
}否则{
排列
}
)
val result=transformeddd.collect()

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

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()
val initialRDD=sparkContext.parallelize(数组(数组[AnyVal](1,2,3)、数组[AnyVal](1,2,3,4)、数组[AnyVal](1,2,3)))
val transformeddd=initialRDD.map(数组=>
if(数组长度<4){
val transformedArray=Array.fill[AnyVal](4)(“NULL”)
复制(数组,0,transformedArray,0,Array.length)
变换阵列
}否则{
排列
}
)
val result=transformeddd.collect()

这个硬编码的
4
让我觉得我可能在
数组中使用了广播。长度
上限。非常感谢!它很有用!这个硬编码的
4
让我觉得我可能使用了
array.length
cap的广播。非常感谢!它很有用!谢谢你的建议!非常感谢你!我试试看!谢谢你的建议!非常感谢你!我试试看!