从散列映射创建数据帧,其中键作为列名称,值作为Spark中的行

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)

我怎样才能做到这一点?

mto*_*oto 5

首先,我们需要创建一个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)