spark数据帧将列名称连接到值

时间:2017-05-17 17:41:08

标签: apache-spark dataframe

我有一个数据框,我想以每一行的方式修改 将包含列名称。 例如:

FirstName LastName
Jhon       Doe
David      Lue

创建以下

(FirstName=Jhon,LastName=Doe)
(FirstName=David,LastName=Lue)

我设法为df做了2列

val x = df.map { row => (names(0) + "=" +row(0) , names(1)+"="+rows(1)}

但是我怎么能用for循环任意数量的列呢?

谢谢

1 个答案:

答案 0 :(得分:8)

一种选择是在列名上使用foldLeft:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.DataFrame

import sqlContext.implicits._
val df = Seq(
  ("John", "Doe"),
  ("David", "Lue")
).toDF("first_name", "last_name")

val x = df.columns.foldLeft(df) {
  (acc: DataFrame, colName: String) => 
    acc.withColumn(colName, concat(lit(colName + "="), col(colName)))
}

x.show()

导致:

+----------------+-------------+
|      first_name|    last_name|
+----------------+-------------+
| first_name=John|last_name=Doe|
|first_name=David|last_name=Lue|
+----------------+-------------+

如果您想将其转换为元组的RDD,您可以在其上调用地图:

x.rdd.map(r => (r.getString(0), r.getString(1)))

甚至使用Spark SQL的类型化API:

x.as[(String, String)].rdd