使用列名作为List中的元素动态添加数据框中的列

时间:2017-03-13 10:26:34

标签: scala apache-spark apache-spark-sql spark-dataframe

我有List [N],如下所示

attach(mtcars)
plot(mpg ~ hp)
abline(v = 170)
text(x = 180, y = 25, label = "Your text here!", srt = 90)

其中N可以是任意数量的元素。

我有一个val check = List ("a","b","c","d") 只有一个名为“value”的列。基于值的内容,我需要创建N列,列名作为列表中的元素,列内容为dataframe

我尝试了所有可能的方法,例如substring(x,y)withColumn,没有任何效果。 请考虑selectExpr其中X和Y是基于某些元数据的某些数字

下面是我尝试的不同代码,但没有一个有效,

substring(X,Y)

testDF2只有最后一列d而其他列如a,b,c未添加到表中

val df = sqlContext.read.text("xxxxx")
val coder: (String => String) = (arg: String) => {
val param = "NULL"
if (arg.length() > Y )
arg.substring(X,Y)
else
val sqlfunc = udf(coder)
val check = List ("a","b","c","d")
for (name <- check){val testDF2 = df.withColumn(name, sqlfunc(df("value")))}

这会引发错误

请帮助如何使用列名作为List

中的元素动态添加DF中的列

我期待下面的Df

var z:Array[String] = new Array[String](check.size)
var i=0
for ( x <- check ) {
if ( (i+1) == check.size) {
z(i) = s""""substring(a.value,X,Y) as $x""""
i = i+1}
else{
z(i) = s""""substring(a.value,X,Y) as $x","""
i = i+1}}
val zz = z.mkString(" ")
df.alias("a").selectExpr(s"$zz").show()

1 个答案:

答案 0 :(得分:1)

您可以使用例如this回复用户6910411从列表中动态添加列到类似的问题(有关更多可能性,请参阅她/他的完整答案):

val newDF = check.foldLeft(<yourdf>)((df, name) => df.withColumn(name,<yourUDF>$"value"))