如何获得在groupby子句中分组的元素的seq?

cgvd09ve  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(521)

我有三个案例课:

case class Section(key: Key, from: String, to: String, travellers: Int)

case class Course(groupedSections: Seq[GroupedSection])

case class GroupedSection(from: String, to: String, sections: Seq[Section])

这些部分不是唯一的。

(Section(key1, "a", "b", 1), Section(key1, "a", "b", 2), Section(key1, "b", "c", 3), Section(key2, "a", "b", 1))

我想得到包含按键分组的部分的课程,在我的例子中是这样的:

(Course(
    GroupedSection("a", "b", (section1, section2 (I shortened this))), GroupedSection("b", "c", (section3))), 
 Course(
    GroupedSection("a", "b", (section4)))
)

sections seq很重要,因此我可以在下一步中获得section类的不同属性。我的问题是,是否可以通过spark在groupedsection类中添加seq中分组的所有部分。我试过这样的方法,但我不知道如何得到一个章节的顺序:

sections
      .groupBy("key")
      .agg(sort_array(collect_list(struct("from", "to"))).as(
        "groupedSections"))
      .select($"groupedSections")
      .as[Course]

如果您需要更多信息,请告诉我:)

2vuwiymt

2vuwiymt1#

您真正想做的是对使用 collect_list 在Dataframe上的groupby期间。
从spark 3.0.1开始,没有内置函数可以按键对数组进行分组。鉴于此,您有两个选择:
您只能使用spark内置函数,然后应该在Dataframe上执行两个groupby。
由于已经有case类,所以可以将dataframe转换为dataset,按键分组,并使用scala代码在数组上执行groupby

仅使用spark内置函数的解决方案

在本例中,执行两个groupby。第一个使用“key”、“from”和“to”列,第二个只使用“key”列。第一个组创建第二个groupby用于创建课程的部分列表:

import org.apache.spark.sql.functions.{col, collect_list, struct}

import sparkSession.implicits._

sections
  .groupBy("key", "from", "to").agg(
    collect_list(
      struct(col("key"), col("from"), col("to"), col("travellers"))
    ).as("sections")
  )
  .groupBy("key").agg(collect_list(
     struct(col("from"), col("to"), col("sections"))
  ).as("groupedSections"))
  .select("groupedSections")
  .as[Course]

数据集解决方案

在这里,您将Dataframe的行强制转换为 Section ,使用方法groupbykey按键分组,然后执行到的转换 Course 使用mapgroups方法:

import sparkSession.implicits._

sections
  .as[Section]
  .groupByKey(_.key)
  .mapGroups((_, sections) => Course(
    sections.toSeq
      .groupBy(s => (s.from, s.to))
      .map(keyValue => GroupedSection(keyValue._1._1, keyValue._1._2, keyValue._2))
      .toSeq
    )
  )

相关问题