在pyspark中连接2个表,多个条件,左连接?

oiopk7p5  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(670)

我有下面两张table。下面的代码是连接两个表(左连接)。问题是我必须做两次相同的连接。第一个连接发生在logno和lognumber上,它返回左表(表1)中的所有记录,以及右表(表2)中匹配的记录。第二个连接也在做同样的事情,但是在lognumber的logno子串上。例如,777将与表2中的777匹配,777-a没有匹配,但当使用子串函数时,777-a变为777,这将在表2中匹配。

不是像下面那样创建两个单独的连接,而是如何用一个连接来覆盖两个场景。代码如下:


# first join to match 1234-A (table 1) with 1234-A (table 2)

df5 = df5.join(df_app, trim(df5.LOG_NO) == trim(df_app.LogNumber), "left")\
         .select (df5["*"], df_app["ApplicationId"])
df5 = df5.withColumnRenamed("ApplicationId","ApplicationId_1")

# second join with substring function, to match 777-C with 777,

# my string is longer than my examples, this is why I have a substring for the first 8 characters. I provided simple examples.

df5 = df5.join(df_app, substring(trim(df5.LOG_NO), 1, 8) == trim(df_app.LogNumber), "left")\
         .select (df5["*"], df_app["ApplicationId"])
df5 = df5.withColumnRenamed("ApplicationId","ApplicationId_2")
nwo49xxi

nwo49xxi1#

可以使用位或组合两个连接条件:

df5 = df5.join(df_app, 
               (trim(df5.LOG_NO) == trim(df_app.LogNumber)) |
               (substring(trim(df5.LOG_NO), 1, 8) == trim(df_app.LogNumber)), 
               "left") \
         .select(df5["*"], df_app["ApplicationId"])

相关问题