pySpark 在多列上加入数据框
pySpark join dataframe on multiple columns
我正在使用下面的代码加入和删除两个数据帧之间的重复项。
但是,得到错误 AnalysisException: Detected implicit cartesian product for LEFT OUTER join between logical plans...Either: use the CROSS JOIN syntax to allow cartesian products between these
relations, or: enable implicit cartesian products by setting the configuration
variable spark.sql.crossJoin.enabled=true;
我的 df1 有 15 列,我的 df2 有 50 多列。如何在不对要加入的列进行硬编码的情况下加入多个列?
def join(dataset_standardFalse, dataset, how='left'):
final_df = dataset_standardFalse.join(dataset, how=how)
repeated_columns = [c for c in dataset_standardFalse.columns if c in dataset.columns]
for col in repeated_columns:
final_df = final_df.drop(dataset[col])
return final_df
具体例子,当比较dataframes的列时,它们会有多个共同的列。我可以加入 cols
的名单吗?我需要避免硬编码名称,因为 cols 会因情况而异。
cols = set(dataset_standardFalse.columns) & (set(dataset.columns))
print(cols)
IIUC 如果它们存在于两个数据框中,您可以直接加入多个列
#This gives you the common columns list from both the dataframes
cols = list(set(dataset_standardFalse.columns) & (set(dataset.columns)))
#Modify your function to specify list of columns for join condition
def join(dataset_standardFalse, dataset, how='left'):
cols = list(set(dataset_standardFalse.columns) & (set(dataset.columns)))
final_df = dataset_standardFalse.join(dataset, cols, how=how)
repeated_columns = [c for c in dataset_standardFalse.columns if c in dataset.columns]
for col in repeated_columns:
final_df = final_df.drop(dataset[col])
return final_df
当您在连接条件中传递列列表时,列应该出现在两个数据框中。如果该列不存在,那么您应该在预处理步骤中重命名该列或动态创建连接条件。
对于动态列名,使用这个:
#Identify the column names from both df
df = df1.join(df2,[col(c1) == col(c2) for c1, c2 in zip(columnDf1, columnDf2)],how='left')
我正在使用下面的代码加入和删除两个数据帧之间的重复项。
但是,得到错误 AnalysisException: Detected implicit cartesian product for LEFT OUTER join between logical plans...Either: use the CROSS JOIN syntax to allow cartesian products between these
relations, or: enable implicit cartesian products by setting the configuration
variable spark.sql.crossJoin.enabled=true;
我的 df1 有 15 列,我的 df2 有 50 多列。如何在不对要加入的列进行硬编码的情况下加入多个列?
def join(dataset_standardFalse, dataset, how='left'):
final_df = dataset_standardFalse.join(dataset, how=how)
repeated_columns = [c for c in dataset_standardFalse.columns if c in dataset.columns]
for col in repeated_columns:
final_df = final_df.drop(dataset[col])
return final_df
具体例子,当比较dataframes的列时,它们会有多个共同的列。我可以加入 cols
的名单吗?我需要避免硬编码名称,因为 cols 会因情况而异。
cols = set(dataset_standardFalse.columns) & (set(dataset.columns))
print(cols)
IIUC 如果它们存在于两个数据框中,您可以直接加入多个列
#This gives you the common columns list from both the dataframes
cols = list(set(dataset_standardFalse.columns) & (set(dataset.columns)))
#Modify your function to specify list of columns for join condition
def join(dataset_standardFalse, dataset, how='left'):
cols = list(set(dataset_standardFalse.columns) & (set(dataset.columns)))
final_df = dataset_standardFalse.join(dataset, cols, how=how)
repeated_columns = [c for c in dataset_standardFalse.columns if c in dataset.columns]
for col in repeated_columns:
final_df = final_df.drop(dataset[col])
return final_df
当您在连接条件中传递列列表时,列应该出现在两个数据框中。如果该列不存在,那么您应该在预处理步骤中重命名该列或动态创建连接条件。
对于动态列名,使用这个:
#Identify the column names from both df
df = df1.join(df2,[col(c1) == col(c2) for c1, c2 in zip(columnDf1, columnDf2)],how='left')