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而不是从条目中映射。非常感谢。