繁体   English   中英

如何在 Spark Scala 中进行年度比较

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM