如何将List [String]附加到DataFrame的每一行?

时间:2017-06-30 03:57:20

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

对DataFrame进行一系列验证后,

我获得了一个包含某些值的字符串列表,如下所示:

List[String]=(lvalue1, lvalue2, lvalue3, ...)

我有一个n值的数据框:

dfield 1  | dfield 2  | dfield 3
___________________________
dvalue1   | dvalue2   | dvalue3
dvalue1   | dvalue2   | dvalue3

我想在我的Dataframe的开头附加List的值,以便得到一个类似这样的新DF:

dfield 1  | dfield 2  | dfield 3 | dfield4 | dfield5 | dfield6
__________________________________________________________
lvalue1   | lvalue2   | lvalue3  | dvalue1 | dvalue2 | dvalue3
lvalue1   | lvalue2   | lvalue3  | dvalue1 | dvalue2 | dvalue3

我找到了something使用UDF。这可能是出于我的目的吗?

问候。

1 个答案:

答案 0 :(得分:3)

TL; DR 使用selectwithColumn lit功能。

我将lit函数与select运算符(或withColumn)一起使用。

  

lit(文字:任意):列创建一个文字值列。

解决方案如下:

val values = List("lvalue1", "lvalue2", "lvalue3")
val dfields = values.indices.map(idx => s"dfield ${idx + 1}")

val dataset = Seq(
  ("dvalue1", "dvalue2", "dvalue3"),
  ("dvalue1", "dvalue2", "dvalue3")
).toDF("dfield 1", "dfield 2", "dfield 3")

val offsets = dataset.
  columns.
  indices.
  map { idx => idx + colNames.size + 1 }

val offsetDF = offsets.zip(dataset.columns).
  foldLeft(dataset) { case (df, (off, col)) => df.withColumnRenamed(col, s"dfield $off") }

val newcols = colNames.zip(dfields).
  map { case (v, dfield) => lit(v) as dfield } :+ col("*")

scala> offsetDF.select(newcols: _*).show
+--------+--------+--------+--------+--------+--------+
|dfield 1|dfield 2|dfield 3|dfield 4|dfield 5|dfield 6|
+--------+--------+--------+--------+--------+--------+
| lvalue1| lvalue2| lvalue3| dvalue1| dvalue2| dvalue3|
| lvalue1| lvalue2| lvalue3| dvalue1| dvalue2| dvalue3|
+--------+--------+--------+--------+--------+--------+