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

Apache spark 在pyspark中连接2个表,多个条件,左连接?,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有两张像下面这样的桌子。我下面的代码是连接两个表(左连接)。问题是我必须做两次相同的连接。第一个连接发生在log_no和LogNumber上,它返回左表(表1)中的所有记录,以及右表(表2)中的匹配记录。第二个连接也在做同样的事情,但是在LogNumber的log_no的子字符串上。例如,777将与表2中的777匹配,777-A不匹配,但当使用子字符串函数时,777-A变为777,这将在表2中匹配 与其像下面那样创建两个单独的联接,不如用一个联接来覆盖这两种情况。代码如下: # first

我有两张像下面这样的桌子。我下面的代码是连接两个表(左连接)。问题是我必须做两次相同的连接。第一个连接发生在log_no和LogNumber上,它返回左表(表1)中的所有记录,以及右表(表2)中的匹配记录。第二个连接也在做同样的事情,但是在LogNumber的log_no的子字符串上。例如,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")

您可以使用按位OR组合两个连接条件:

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"])

我很困惑,为什么?这意味着这两个条件都必须成立。如果第一个条件失败,则子字符串条件应为真。@AJR对不起,应为或。编辑了我的答案。我的程序没有结束。。。。我不得不在加倍的时间后杀死它。通常我的胶水工作需要22分钟才能完成,我让它运行了44分钟,它仍然在运行。。。我认为出于某种原因,按位或将我的程序放入循环中,它不会结束。还有其他建议吗??thanks@AJR首先尝试使用较小的数据帧,以检查它是否正确执行任务。“或”不可能将您的程序置于循环中。这根本不可能。