使用scala过滤spark中未激活的行

yftpprvb  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(406)

我对spark和scala编程非常陌生,我有一个问题,希望一些聪明人能帮我解决。我有一个名为users的表,表中有4列:status、userid、name、date
行是:

  1. status user_id name date
  2. active 1 Peter 2020-01-01
  3. active 2 John 2020-01-01
  4. active 3 Alex 2020-01-01
  5. inactive 1 Peter 2020-02-01
  6. inactive 2 John 2020-01-01

我只需要选择活动用户。两个用户被停用。同一天只有一个被灭活了。
我的目标是过滤非活动状态的行(我可以这样做),并在非活动行与活动行的列匹配时过滤非活动用户。彼得在不同的日期被灭活了,他没有被过滤。预期结果是:

  1. 1 Peter 2020-01-01
  2. 3 Alex 2020-01-01

已筛选非活动状态的行。john被禁用了,所以他的行也被过滤了。
我最接近的方法是筛选处于非活动状态的用户:

  1. val users = spark.table("db.users")
  2. .filter(col("status").not Equal("Inactive"))
  3. .select("user_id", "name", "date")

如何解决这个问题有什么想法或建议吗?谢谢!

yvgpqqbh

yvgpqqbh1#

首先用groupby检查每个用户和日期的非活动项,并将此结果加入原始df。

  1. val df2 = df.groupBy('user_id, 'date).agg(max('status).as("status"))
  2. .filter("status = 'inactive'")
  3. .withColumnRenamed("status", "inactive")
  4. df.join(df2, Seq("user_id", "date"), "left")
  5. .filter('inactive.isNull)
  6. .select(df.columns.head, df.columns.tail: _*)
  7. .show()
  8. +------+-------+-----+----------+
  9. |status|user_id| name| date|
  10. +------+-------+-----+----------+
  11. |active| 1|Peter|2020-01-01|
  12. |active| 3| Alex|2020-01-01|
  13. +------+-------+-----+----------+

相关问题