pyspark中的范围连接

roejwanj  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(116)

给定两个 Dataframe ,我需要根据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()
mefy6pfw

mefy6pfw1#

让我们尝试使用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|
+---+----------+

相关问题