开发背景
前段时间有一个开发需求的一小块用到了这,是一个利用率的计算。规则是某id下的近半年的值的小时利用率。
计算规则是某值除以近半年 天数以及24h,但是月份里面数据有空值,所以要计算一下id对应的月份的天数,并且过滤掉数据有空值的天数。然后在做计算。
我这个人写博客,总喜欢交代一下背景,好提醒自己这块是哪块的业务知识。业务千变万化,逻辑倒是少得可怜。
本文将介绍如何Spark框架来计算给定日期所在月份的天数,并将其应用于一个实际的数据集。使用DataFrame和UDF来实现
已下面的数据为例
(1, "2024-01-01", 15),
(1, "2024-02-02", 23),
(1, "2024-03-03", 0),
(2, "2024-01-01", 20),
(2, "2024-01-02", 23),
(2, "2024-08-05", 40)
话不多说,直接上代码
代码:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import java.time.LocalDate
object CalculateDaysInMonth {
def main(args: Array[String]): Unit = {
// 创建SparkSession
val spark = SparkSession.builder()
.appName("CalculateDaysInMonth")
.master("local[*]")
.getOrCreate()
import spark.implicits._
val data = Seq(
(1, "2024-01-01", 15),
(1, "2024-02-01", 23),
(1, "2024-05-01", 0),
(2, "2024-06-01", 20),A
(2, "2024-07-05", 23),
(2, "2024-08-01", 40)
).toDF("id", "date", "value")
// 获取id对应的月份天数
val getMonthDays = udf((dateStr: String) => {
LocalDate.parse(dateStr).lengthOfMonth()
})
// val result = data.withColumn("days_in_month", getMonthDays($"date"))
// when-otherwise表达式结合UDF来决定days_in_month的值
val result = data.withColumn("days_in_month",
when($"value" =!= 0, getMonthDays($"date")).otherwise(lit(0))
)
//author:lixh 博客地址https://blog.csdn.net/qq_52128187?type=blog
result.show()
spark.stop()
}
}
逻辑就是上面的了,基本上简单易懂,上手快!
打印结果
得到这个结果我们就可以做后面的操作了,这是demo,比如说可以计算后续的操作了,over