sat*_*117 0 sql scala apache-spark
我有以下数据帧
+-----+-----+-----+ .......+-------+
|item1|item2|item3|........| itemN |
+-----+-----+-----+........|-------+
| v1| v2| v3|........| vN----+
| v4| v5| v6|........| v2N---+
+-----+-----+-----+........|-------+
Run Code Online (Sandbox Code Playgroud)
这里item1,item2和item3是列名,表由1行v1,v2,v3组成.
我想把它变成
colA colB
item1 v1
item2 v2
item3 v3
. .
. .
. .
Run Code Online (Sandbox Code Playgroud)
这里有两列,比如说colA和colB,行如图所示.
如何使用scala在spark中进行这种转换?
你可以使用explode:
import org.apache.spark.sql.functions._
input.show()
// +-----+-----+-----+
// |item1|item2|item3|
// +-----+-----+-----+
// | v1| v2| v3|
// | v4| v5| v6|
// +-----+-----+-----+
val columns: Array[String] = input.columns
val result = input.explode(columns.map(s => col(s)): _*) {
r: Row => columns.zipWithIndex.map { case (name, index) => (name, r.getAs[String](index)) }
}.select($"_1" as "colA", $"_2" as "colB")
result.show()
// +-----+----+
// | colA|colB|
// +-----+----+
// |item1| v1|
// |item2| v2|
// |item3| v3|
// |item1| v4|
// |item2| v5|
// |item3| v6|
// +-----+----+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |