在数据框中动态添加列,列名作为 List 中的元素
Posted
技术标签:
【中文标题】在数据框中动态添加列,列名作为 List 中的元素【英文标题】:add columns in dataframes dynamically with column names as elements in List 【发布时间】:2017-03-13 10:26:34 【问题描述】:我有如下列表[N]
val check = List ("a","b","c","d")
其中 N 可以是任意数量的元素。
我有一个dataframe
,只有一个名为“值”的列。根据 value 的内容,我需要创建 N 列,列名作为列表中的元素,列内容为substring(x,y)
我已经尝试了所有可能的方法,例如withColumn
、selectExpr
,但没有任何效果。
请考虑substring(X,Y)
,其中 X 和 Y 是基于某些元数据的一些数字
以下是我尝试过的不同代码,但没有一个有效,
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")))
testDF2 只有最后一列 d,其他列如 a,b,c 未添加到表中
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()
这会引发错误
请帮助如何在 DF 中动态添加列,列名作为 List 中的元素
我期待一个像下面这样的 Df
-----------------------------
Value| a | b | c | d | .... N
-----------------------------
|xxx|xxx|xxx|xxx|xxx|xxxxxx-
|xxx|xxx|xxx|xxx|xxx|xxxxxx-
|xxx|xxx|xxx|xxx|xxx|xxxxxx-
-----------------------------
【问题讨论】:
请格式化您的问题并显示示例数据以及预期输出。 还是不清楚,原df
是什么内容
只有一个名为 value 的列,其中包含一些数据 @mtoto
然后请分享它,并再次清理您的代码。我试着为你做,但还是一团糟。
【参考方案1】:
您可以使用例如this user6910411 对类似问题的回答从列表中动态添加列(有关更多可能性,请参阅她/他的完整答案):
val newDF = check.foldLeft(<yourdf>)((df, name) => df.withColumn(name,<yourUDF>$"value"))
【讨论】:
以上是关于在数据框中动态添加列,列名作为 List 中的元素的主要内容,如果未能解决你的问题,请参考以下文章