有一个dataframe
[user  | pay_time | pay_amount]按照用户分组后如何获取支付时间(pay_time ) 最小的那条记录的 支付金额 pay_amount
df.groupby("user").agg(
        F.min("pay_time ").alias("first_pay_time"),            # 首充时间
        F.sum("pay_amount").alias("tot_pay_amount"),  # 累计充值金额
       # 如何获得首充金额
)
目的是分析出玩家的首充时间和首充金额

解决方案 »

  1.   

    两种方式:
    1:val first_TimeDF = df.groupby("user").agg(F.min("pay_time ").alias("first_pay_time"))
         val full_InfoDF = first_TimeDF.join(df, Seq("user", "pay_time"), "left")
    这种方式显然需要先聚合求最小(丢失了首充金额),需要再join回原先的数据集。
    2:val win = Window.partitionBy("user").orderBy("pay_time")
         val firstDF = df.withColumn("rownum", row_number().over(win)).filter("rownum = 1").drop("rownum")
    这种方式使用了开窗函数,通过user分组,pay_time升序排列,获取序号为1的信息,即每个用户,首充时间,首充金额。