微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PySpark Groupby条件过滤

如何解决PySpark Groupby条件过滤

我正在研究pyspark中的结构化数据框。从s3读取实木复合地板格式的数据。然后,我想用条件过滤掉一些数据。 例如:

Data:
key_1  value rec_date
  A     1    2020-01-01
  A     2    2020-01-02
  A    10    2020-01-03
  B    10    2020-10-10
  B    10    2020-10-11
  B    10    2020-10-12
Filter Condition:
{"A":{'abnormal_daterange':[('2020-01-01','2020-01-02'),('2020-02-01','2020-02-04')]},"B": {'abnormal_daterange':[('2020-10-10','2020-10-11')]}
}
Expected result:
key_1  value rec_date
  A    10    2020-01-03
  B    10    2020-10-12

我知道我可以使用@pandas-udf来创建要group by函数并根据条件进行过滤,但是我想简化代码并且不要过度设计。

任何结构化数据帧filter /内置函数都可以有效过滤具有条件的数据吗?

解决方法

假设您有dffilterDf

df = spark.createDataFrame(
    [
        ("A","1","2020-01-01"),("A","2","2020-01-02"),"10","2020-01-03"),("B","2020-10-10"),"2020-10-11"),"2020-10-12")
    ],['key_1','value','rec_date']
)

filterDf = spark.createDataFrame(
    [
        ("A","2020-01-01","2020-10-01","2020-10-11")
    ],["key","start_date","end_date"]
)

然后,您可以使用左反连接对df的内容过滤filterDf

res = df.join(
    filterDf.hint("broadcast"),(col("key_1") == col("key")) & (col("rec_date").between(col("start_date"),col("end_date"))),"leftanti"
)

结果将是:

+-----+-----+----------+
|key_1|value|  rec_date|
+-----+-----+----------+
|    A|   10|2020-01-03|
|    B|   10|2020-10-12|
+-----+-----+----------+

然后,您可以应用groupBy聚合。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。