繁体   English   中英

如何使用循环创建连接条件?

[英]How to create a join condition using a loop?

我正在创建一个通用条件来连接 2 个数据帧,这些数据帧与下面的代码具有相同的键和相同的结构。 我想将其作为比较 2 个数据帧的功能。 第一个想法,我把它作为字符串条件,因为它很容易将条件与循环连接起来。 最后,似乎连接条件无法接受字符串条件。 有人可以指导我吗?

import pyspark.sql.functions as F

key = "col1 col2 col3"

def CompareData(df1,df2,key) :
  key_list = key.split(" ")
  key_con=""

  for col in key_list:
    condi = "(F.col(\"" + col +"\") == F.col(\""+"x_"+col+"\"))"  # trying to generate generic condition
    key_con=key_con + "&" + condi

  key_condition=key_con.replace('&','',1)

  df1_tmp = df1.select([F.col(c).alias("x_"+c) for c in df1.columns])

  df_compare = df2.join(df1_tmp, key_condition , "left")  # The problem was here. key_condition has error. If I copy the condition string below and place into join condition, it works fine.

  # key_condition = (F.col("col1") == F.col("x_col1")) & (F.col("col2") == F.col("x_col2")) & (F.col("col3") == F.col("x_col3")) 

尝试这个:

  key_con = F.lit(True)
  for col in key_list:
    condi = (F.col(col) == F.col(f"x_{col}"))
    key_con = key_con & condi

在您的尝试中,您的条件是string类型。 但是join的参数on只接受字符串,如果它是一个普通的列名。 您正在尝试创建一个列表达式并将其传递给on参数。 列表达式与字符串不同,因此您需要一种稍微不同的方法来制作复合列表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM