spark2.1 Row_number,Window使用

有这种情况,一个项目下的一个设备多次上报检测成功记录,但我只要最早上报记录

代码如下:

package com.spark

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

object LastestTime {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder.appName(s"${this.getClass.getSimpleName}").master("local[4]").getOrCreate();

    import spark.implicits._
    val s = spark.read.json("/user/kafka/flume/ota_check/pt=2017-11-17")
    s.printSchema();

    val w = Window.partitionBy($"product_id", $"device_id", $"check_status").orderBy($"create_time".asc_nulls_last);

    val filterResult = s.withColumn("rank", row_number.over(w)).where($"rank" === 1).drop("rank");

    filterResult.show();
  }
}

主要按项目号,设备号,上报状态分组,且看时间升序排序,选取第一条记录.
它是先新建rank一列,最后再删除这列.


附:Java版代码

import org.apache.spark.sql.expressions.Window;
import org.apache.spark.sql.expressions.WindowSpec;
....

WindowSpec w= Window.partitionBy("product_id","device_id","check_status").orderBy(col("create_time").asc_nulls_last());
Dataset<Row> userLastestOrder=tableData.withColumn("rank",row_number().over(w)).where(col("rank").equalTo(1)).drop("rank");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值