在Spark Scala中查找年份和月份的最小值和最大值

时间:2019-06-18 21:05:46

标签: scala apache-spark

我想从spark数据框中找到年份和月份的最小值和年份和月份的最大值。下面是我的数据框

code  year  month 
xx    2004  1
xx    2004  2
xxx   2004  3
xx    2004  6
xx    2011  12
xx    2018  10 

我希望最小月份和年份为2004-1,最大月份和年份为2018-10

我尝试的解决方案是

  val minAnMaxYearAndMonth = dataSet.agg(min(Year),max(Month)).head()
val minYear = minAnMaxYearAndMonth(0)
val maxYear = minAnMaxYearAndMonth(1)
val minMonth = dataSet.select(Month).where(col(Year)  === minYear).take(1)
val maxMonth = dataSet.select(Month).where(col(Year)  === maxYear).take(1)

获取minYear和MaxYear,但不获取min和max Month。请帮助

1 个答案:

答案 0 :(得分:0)

您可以使用struct用几年和几个月来制作元组,然后依靠元组排序。元组主要由最左侧的组件排序,然后使用下一个组件作为平局。

df.select(struct("year", "month") as "ym")
  .agg(min("ym") as "min", max("ym") as "max")
  .selectExpr("stack(2, 'min', min.*, 'max', max.*) as (agg, year, month)")
  .show()

输出:

+---+----+-----+
|agg|year|month|
+---+----+-----+
|min|2004|    1|
|max|2018|   10|
+---+----+-----+