我有一个具有以下架构的 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]]
基本上,只要名称相同,就需要每个记录级别的值列表。在上面的数据集中,feature.id 相同,因此需要记录级别的值列表。
预期数据集
[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")
.
关于java - 如果 Spark 数据集中的记录键相同,如何创建值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50889714/