您好我尝试使用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)).
我该怎么办? 有没有办法解决它?
答案 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()