如何根据来自其他 pyspark 数据帧的日期值过滤第二个 pyspark 数据帧?

Posted

技术标签:

【中文标题】如何根据来自其他 pyspark 数据帧的日期值过滤第二个 pyspark 数据帧?【英文标题】:How to filter a second pyspark dataframe based on date value from other pyspark dataframe? 【发布时间】:2019-11-12 09:44:49 【问题描述】:

我有一个填充了 load_date_time 的 DataFrame。我想用其他数据帧中的 max(date_value) 过滤这个数据帧。

我已尝试执行以下操作。

df2_max_create_date = df2.select("create_date").agg(F.max(df_dsa["create_date"]))
df2_max_create_date.show()
+----------------+
|max(create_date)|
+----------------+
|      2019-11-10|
+----------------+

然后尝试根据此日期过滤第一个数据帧。它有一个名为 load_date_time 的时间戳列。

df_delta = df1.where(F.col('load_date_time') > (F.lit(df2_max_create_date)))

但我遇到了错误。

AttributeError: 'DataFrame' object has no attribute '_get_object_id'

【问题讨论】:

只需使用joindf_delta = df1.alias("l").crossJoin(df2_max_create_date).where(F.col("load_date_time") > F.col("max(create_date)")).select("l.*"). 像魅力一样工作。 【参考方案1】:

你可以通过调用collect获取max_date变量:

max_create_date = df2.select(F.max(df_dsa["create_date"])).collect()[0][0]
df_delta = df1.where(F.col('load_date_time') > max_create_date)

【讨论】:

仅供参考:使用join 几乎总是优于collect @pault 知道了!我也明白为什么。 为什么在 collect() 上使用交叉连接更划算? @anidev711 Collect 是一个动作,而 join 是一个转换。阅读此问答***.com/questions/44174747/…

以上是关于如何根据来自其他 pyspark 数据帧的日期值过滤第二个 pyspark 数据帧?的主要内容,如果未能解决你的问题,请参考以下文章

(运行的干净代码)根据来自另一个数据帧的日期间隔和字符串条件获取一个数据帧中的值的平均值

根据来自其他数据帧的位置条件在数据帧上编写选择查询,scala

在多个条件下合并来自多个数据帧的数据

如何使用具有不同列号pyspark的两个数据帧的并集

在多个条件下合并来自多个数据帧的数据

Pyspark - 如何将多个数据帧的列连接成一个数据帧的列