代码之家  ›  专栏  ›  技术社区  ›  Sekhar

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

  •  1
  • Sekhar  · 技术社区  · 6 年前

    我有一个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)
    

    显示()

           [[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]
    

    有人能帮忙吗?.

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ramesh Maharjan    6 年前

    组合 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")
    

    .