Scala 如何将包含某个结构数组的列拆分为单独的列?

Scala 如何将包含某个结构数组的列拆分为单独的列?,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,我有以下几种情况: case类属性(键:字符串,值:字符串) 案例类实体(id:String,attr:List[属性]) val实体=列表(实体(“1”、列表(属性(“名称”、“萨沙”)、属性(“主页”、“删除”)), 实体(“2”,列表(属性(“主”、“液压”)) val df=entities.toDF() //df.show +---+--------------------+ |id | attr| +---+--------------------+ |1 |[[姓名,萨沙],[d.

我有以下几种情况:

case类属性(键:字符串,值:字符串)
案例类实体(id:String,attr:List[属性])
val实体=列表(实体(“1”、列表(属性(“名称”、“萨沙”)、属性(“主页”、“删除”)),
实体(“2”,列表(属性(“主”、“液压”))
val df=entities.toDF()
//df.show
+---+--------------------+
|id | attr|
+---+--------------------+
|1 |[[姓名,萨沙],[d.]|
|2 |[[总部,路政署]]|
+---+--------------------+
//打印模式
根
|--id:string(nullable=true)
|--attr:array(nullable=true)
||--元素:struct(containsnall=true)
|| |--key:string(nullable=true)
|| |--value:string(nullable=true)
我想生产的是

+---+--------------------+-------+
| id|  name              |  home |
+---+--------------------+-------+
|  1| sasha              |del    |
|  2| null               |hyd    |
+---+--------------------+-------+
我怎么做呢?我看了很多类似的问题,但没有找到任何有用的

我的主要动机是对不同的属性进行分组,因此希望采用上述格式

我研究了分解功能。它将列表分解为单独的行,我不希望这样。我想从
属性的数组中创建更多的列

我发现了类似的事情:


可以轻松简化为或。首先将
attr
转换为
map

那就是找到唯一的钥匙

val keys = dfMap.select(explode(map_keys($"attr"))).as[String].distinct.collect
然后从地图中选择

val result = dfMap.select($"id" +: keys.map(key => $"attr"(key) as key): _*)
result.show
+---+-----+----+
|id | name | home|
+---+-----+----+
|1 |萨沙|德尔|
|2 |零|液压|
+---+-----+----+
效率较低但更简洁的变体是
分解
透视

val result = df
  .select($"id", explode(map_from_entries($"attr")))
  .groupBy($"id")
  .pivot($"key")
  .agg(first($"value"))

result.show
+---+----+-----+
|id |家|名|
+---+----+-----+
|1 |德尔|萨沙|
|2 |液压|零|
+---+----+-----+

但实际上我建议不要这样做。

这很容易简化为或。首先将
attr
转换为
map

那就是找到唯一的钥匙

val keys = dfMap.select(explode(map_keys($"attr"))).as[String].distinct.collect
然后从地图中选择

val result = dfMap.select($"id" +: keys.map(key => $"attr"(key) as key): _*)
result.show
+---+-----+----+
|id | name | home|
+---+-----+----+
|1 |萨沙|德尔|
|2 |零|液压|
+---+-----+----+
效率较低但更简洁的变体是
分解
透视

val result = df
  .select($"id", explode(map_from_entries($"attr")))
  .groupBy($"id")
  .pivot($"key")
  .agg(first($"value"))

result.show
+---+----+-----+
|id |家|名|
+---+----+-----+
|1 |德尔|萨沙|
|2 |液压|零|
+---+----+-----+
但实际上我建议不要这样做。

从这里使用udf而不是从条目中映射。非常感谢。从这里使用udf而不是从条目中映射。非常感谢。