[英]How to do yearly comparison in spark scala
我的數據框包含月份和數量等列,如下表所示。
| 月 | 水果 | 數量 |
| -------- | ------ | ------ |
| 2021-01 | 橙色 | 5223 |
| 2021-02 | 橙色 | 23 |
| ...... | ..... | ..... |
| 2022-01 | 橙色 | 第2342章
| 2022-02 | 橙色 | 37667 |
我需要按水果計算數量組的總和。 我的輸出 DF 將在下表中
| 水果 | sum_of_qty_This_year | sum_of_qty_previous_year |
| -------- | --------------------- | -------------------------- |
| 橙色 | 29384 | 345345 |
但這里有一個問題,請考慮下表。
今年 | 一月 | 二月 | 馬爾 | 四月 | 可能 | 君 | 七月 | 八月 | 九月 | 十月 | 十一月 | 十二月 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
上一年 | 一月 | 二月 | 四月 | 可能 | 君 | 七月 | 八月 | 十月 | 十一月 | 十二月 |
如您所見,前一年缺少 mar 和 sep 的數據。 所以當我們計算當年數量的總和時,它應該排除缺失的月份。
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.{col, sum}
import spark.implicits._
val df1 = Seq(
("2021-01", "orange", 5223),
("2021-02", "orange", 23),
("2022-01", "orange", 2342),
("2022-02", "orange", 37667),
("2022-03", "orange", 50000)
).toDF("Month", "Fruit", "Qty")
val currentYear = 2022
val priorYear = 2021
val currentYearDF = df1
.filter(col("Month").substr(1, 4) === currentYear)
val priorYearDF = df1
.filter(col("Month").substr(1, 4) === priorYear)
.withColumnRenamed("Month", "MonthP")
.withColumnRenamed("Fruit", "FruitP")
.withColumnRenamed("Qty", "QtyP")
val resDF = priorYearDF
.join(
currentYearDF,
priorYearDF
.col("FruitP") === currentYearDF.col("Fruit") && priorYearDF
.col("MonthP")
.substr(6, 2) === currentYearDF.col("Month").substr(6, 2)
)
.select(
currentYearDF.col("Fruit").as("Fruit"),
currentYearDF.col("Qty").as("CurrentYearQty"),
priorYearDF.col("QtyP").as("PriorYearQty")
)
.groupBy("Fruit")
.agg(
sum("CurrentYearQty").as("sum_of_qty_This_year"),
sum("PriorYearQty").as("sum_of_qty_previous_year")
)
resDF.show(false)
// +------+--------------------+------------------------+
// |Fruit |sum_of_qty_This_year|sum_of_qty_previous_year|
// +------+--------------------+------------------------+
// |orange|40009 |5246 |
// +------+--------------------+------------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.