Arrays 如何在spark中向rdd数组插入元素
您好,我已经尝试使用spark中的scala将元素插入rdd数组[String] 下面是一个例子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
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的广播。非常感谢!它很有用!谢谢你的建议!非常感谢你!我试试看!谢谢你的建议!非常感谢你!我试试看!