繁体   English   中英

如果密钥与Spark Dataset中的记录相同,如何创建值列表

[英]How to create a List of values if key is same for record in Spark Dataset

我有一个具有以下架构的Spark数据集。

Spark版本2.2和Java版本1.8。

df.printSchema()

                 root
                 |-- PROP: array (nullable = true)
                 |    |-- element: struct (containsNull = true)
                 |    |    |-- PVAL: string (nullable = true)
                 |    |    |-- _NAME: string (nullable = true)

df.show()

       [[200 Hours,displayName],[f44066,feature.id], [f48062,feature.id],[f30079,feature.id], [f30078,feature.id], [f30077,feature.id],[text1,description]]
       [[300 Hours,displayName],f44022,feature.id], [f48033,feature.id],[f30044,feature.id], [f30055,feature.id], [f30066,feature.id],[text2,description]]

基本上,无论NAME是否相同,都需要每个记录级别的值列表。 在上述数据集中,feature.id是相同的,因此需要记录级别的值列表。

ExpectedDataset

       [200 Hours,displayName],[[f44066,f48062,f30079,f30078,f30077],feature.id],[text1,description]
       [300 Hours,displayName],[[f44022,f48033,f30044,f30055,f30066],feature.id],[text2,description]

有人可以帮忙吗?

explode组合, collect_list应该会给你你想要的输出

import org.apache.spark.sql.functions._
df.withColumn("sno", monotonically_increasing_id())
   .select(col("sno"), explode(col("PROP")).as("PROP"))
   .select(col("sno"), col("PROP.*"))
   .groupBy("sno", "_NAME")
   .agg(collect_list("PVAL").as("PVAL"))
   .groupBy("sno")
   .agg(collect_list(struct("PVAL", "_NAME")).as("PROP"))
   .drop("sno")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM