【问题标题】:range joins in pyspark范围加入 pyspark
【发布时间】:2022-09-27 12:05:41
【问题描述】:

给定两个数据框,我需要根据df1 中相似ID 的范围过滤df2 中的记录。我想知道是否有比下面显示的幼稚方法更好(更快)的方法。在我的用例中,df1 有 1 亿条记录,df2 有超过 10 亿条记录。

df1 = spark.createDataFrame(pd.DataFrame([[\"A\",10,20],[\"B\",5,8]],
  columns=[\"id\",\"start_dt_int\",\"end_dt_int\"]))
df2 = spark.createDataFrame(pd.DataFrame([[\"A\",15],[\"A\",25],[\"B\",9]],
  columns=[\"id\",\"enc_dt_int\"]))

comb = [df1.id==df2.id, df1.start_dt_int<=df2.enc_dt_int, df2.enc_dt_int<=df1.end_dt_int]
df2.join(df1, on=comb, how=\"leftsemi\").show()
  • 我认为您也可以通过 LEFT join 和 SELECT like \'df2.*\' 来实现这一点。但是,LEFTSEMI 效率更高,然后 LEFT 只加入。这对您来说可能是一个重要因素,因为您正在处理大量数据

标签: pyspark left-join


【解决方案1】:

让我们尝试使用 spark sql 进行范围连接

创建数据库表

df2.createOrReplaceTempView('df2')

df1.createOrReplaceTempView('df1')

范围连接,然后删除不需要的列

spark.sql("""SELECT *
FROM df2
  JOIN df1 ON (df2.id = df1.id)
  and df2.enc_dt_int BETWEEN df1.start_dt_int AND df1.end_dt_int""").select([df1.id, 'enc_dt_int']).show()

输出

+---+----------+
| id|enc_dt_int|
+---+----------+
|  A|        15|
+---+----------+

【讨论】:

  • 感谢您发布此信息。根据我的数据,这并没有比上面的运行速度快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2017-06-13
  • 1970-01-01
  • 2011-10-19
  • 2017-04-27
  • 2011-01-19
相关资源
最近更新 更多