Apache Spark 每日更新行的行重复数据删除问题,如何避免计算相同的行?

bvn4nwqk  于 2022-12-13  发布在  Apache
关注(0)|答案(1)|浏览(121)

该特定 Dataframe 每天更新一次,更新内容包括“客户ID”、“状态”和更新发生的“日期”,示例如下:example
有些客户端每天都会收到更新,有些则不会。有些客户端可能会在几天内将状态从“否”更改为“是”,反之亦然
状态为“是”时,可通过以下方式获取:

df = df \
    .select('id','status','date') \
    .filter(
        (col('date') >= '2022-10-01') &
        (col('date') <= '2022-10-31') & 
        (col(status) == "yes"))

第二个选择必须没有出现在“是”查询中的ID。每个示例见ID“123”,如果我排除了所有带有“是”的行,我仍然在查询的“否”部分计算该客户。
尝试使用OVER函数基于ID创建一个标志,以排除我已经选择的内容,然后应用过滤器,但它不起作用,pyspark说该表达式在窗口函数中不受支持。
第一次

iibxawm4

iibxawm41#

我有一个可能工作的解决方案,但我不确定它是否在时间和资源方面的好解决方案,所以如果有人知道如何改进它,请留下评论。目前我无法找出其他任何东西,但也许它会对你有用。我有一种感觉,有一些技巧,我不知道做得更聪明:D

import datetime 
import pyspark.sql.functions as F

x = [(123,"no", datetime.date(2020,10,25)),
    (123,"yes", datetime.date(2020,10,22)),
    (4141,"no", datetime.date(2020,10,25)),
    (4141,"no", datetime.date(2020,10,22)),
    (4141,"no", datetime.date(2020,10,15)),
    (5555,"yes", datetime.date(2020,10,25)),
    (5555,"no", datetime.date(2020,10,22)),
    (5555,"no", datetime.date(2020,10,15))]
df = spark.createDataFrame(x, schema=['customer_id', 'status', 'date'])
groupedDf = df.groupBy(F.col('customer_id'), F.col('status')).agg(F.max("date").alias("most_recent_date")).cache()
trueDf = groupedDf.filter(F.col('status') == F.lit('yes'))
falseDf = groupedDf.filter(F.col('status') == F.lit('no'))
falseWithNoCorrecpondingTrueDf = falseDf.join(trueDf, falseDf.customer_id == trueDf.customer_id, "anti")
finalDf = falseWithNoCorrecpondingTrueDf.union(trueDf)

dfs不需要单独的变量,我添加它是为了使它更具描述性。
分步说明:

  • 首先,我对记录进行分组,以获取customer_id和status的最大日期
  • 然后缓存分组的结果,因为我知道它将被使用两次,我不想计算它两次
  • 我将group by的结果拆分为两部分,一部分为“是”,另一部分为“否”。
  • 我放弃了对应于“是”的“否”,因为根据您的逻辑,它们不会被使用
  • 我正在做一个“no”的并集,剩下的都是“yes”,这应该会给予我你想要的结果df

示例作业的输出:

+-----------+------+----------------+
|customer_id|status|most_recent_date|
+-----------+------+----------------+
|       4141|    no|      2020-10-25|
|        123|   yes|      2020-10-22|
|       5555|   yes|      2020-10-25|
+-----------+------+----------------+

相关问题