我有一个数据框,我想以每一行的方式修改 将包含列名称。 例如:
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循环任意数量的列呢?
谢谢
答案 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