案例

23 篇文章 3 订阅

简化需求

一张hive表,有三个字段id,score,date,分别代表用户,信用得分,日期。格式如下:

1,50,201909
2,60,201909
1,30,201910
2,62,201910

每个月根据用户的消费情况得出其信用得分,但是有个前提是,本月的得分不能低于上月

需求分析

也就是计算出本月得分后和上个月的得分进行比较,当本月得分小于上个月得分,则用上个月得分替代。可怎么实现需求呢?Hive根本不支持行级别的更改数据啊…
经过冥思苦想,感觉得换一个思路了,反正我就是要取两个值的最大值嘛,那不就是开窗函数就能搞定的吗?

具体实现

object Test{
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org").setLevel(Level.ERROR)
    val spark = SparkSession
      .builder()
      .appName(this.getClass.getSimpleName)
      .master("local[*]")
      .getOrCreate()
    import spark.implicits._
    spark.read.textFile("./data/comp")
      .map(_.split(","))
      .map(x => (x(0), x(1)))
      .toDF("id", "score")
      .createTempView(viewName = "view")

    import spark.sql
    sql(sqlText = "select id,score from (select id,score,row_number() " +
      "over(partition by id order by score desc) as rn from view) as t where t.rn = 1")
      .createTempView(viewName = "view1")

    sql(sqlText = "select id,score,'201910' as date from view1").show()
    spark.stop()
  }
}

结果

+---+-----+------+
| id|score|  date|
+---+-----+------+
|  1|   50|201910|
|  2|   62|201910|
+---+-----+------+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值