簡體   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