我有三个案例课:
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]
如果您需要更多信息,请告诉我:)
1条答案
按热度按时间2vuwiymt1#
您真正想做的是对使用
collect_list
在Dataframe上的groupby期间。从spark 3.0.1开始,没有内置函数可以按键对数组进行分组。鉴于此,您有两个选择:
您只能使用spark内置函数,然后应该在Dataframe上执行两个groupby。
由于已经有case类,所以可以将dataframe转换为dataset,按键分组,并使用scala代码在数组上执行groupby
仅使用spark内置函数的解决方案
在本例中,执行两个groupby。第一个使用“key”、“from”和“to”列,第二个只使用“key”列。第一个组创建第二个groupby用于创建课程的部分列表:
数据集解决方案
在这里,您将Dataframe的行强制转换为
Section
,使用方法groupbykey按键分组,然后执行到的转换Course
使用mapgroups方法: