Neh*_*eha 2 scala dataframe apache-spark apache-spark-sql
我有一个数据框,我有一个列,这是一个像这样的数据帧中的地图 -
scala> df.printSchema
Run Code Online (Sandbox Code Playgroud)
root
|-- A1: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
Run Code Online (Sandbox Code Playgroud)
我需要从dataframe中选择所有键作为列名称,将值作为行.
例如:假设我有2条记录,如下所示 -
1. key1 -> value1, key2 -> value2, key3 -> value3 ....
2. key1 -> value11, key3 -> value13, key4 -> value14 ...
Run Code Online (Sandbox Code Playgroud)
我希望输出数据帧为
key1 key2 key3 key4
value1 value2 value3 null
value11 null value13 value14
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
首先,我们需要创建一个id列,通过该列我们可以对数据进行分组,然后explode是地图列A1,最后重塑您的df使用pivot():
import org.apache.spark.sql.functions.{monotonically_increasing_id, explode, first}
df.withColumn("id", (monotonically_increasing_id()))
.select($"id", explode($"A1"))
.groupBy("id")
.pivot("key")
.agg(first("value")).show()
+---+-------+------+-------+-------+
| id| key1| key2| key3| key4|
+---+-------+------+-------+-------+
| 0| value1|value2| value3| null|
| 1|value11| null|value13|value14|
+---+-------+------+-------+-------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2530 次 |
| 最近记录: |