java - 如果 Spark 数据集中的记录键相同,如何创建值列表

标签 java scala apache-spark

我有一个具有以下架构的 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]

有人可以帮忙吗?

最佳答案

explodecollect_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/

相关文章:

java - AuthMe 如何在身份验证之前阻止 Minecraft 中的操作?

hadoop - Apache Hadoop Yarn - 内核利用率不足

scala - 如何在 Apache Spark 中使用 DStream 进行特征提取

java - OnCreate 中的 PopupWindow 和 ShowAtLocation - 如何获取父 View ?

java - Android 入口点

java - 如何使用 Serenity 调用 IEDriver

scala - 两个列表的笛卡尔积

scala - 如何创建打印命令行参数的任务?

scala - Scala REPL 和 Clojure REPL 的区别——编译速度

amazon-web-services - 在 AWS EMR 集群中哪里可以找到节点日志?