结合多个带有不同列的pyspark数据框

时间:2019-12-27 19:42:39

标签: python apache-spark pyspark pyspark-sql pyspark-dataframes

我有一本包含20多个数据帧的字典。它们每个都有不同的列和大小。

我想遍历字典并一次比较2个数据帧(left_dfrigt_df),将right_df中不存在的列添加到{ {1}},反之亦然。目标是合并所有20多个df,最后得到一个单个数据帧。

这是我尝试的方法,我首先将dfs分为2个字典:

left_df

我仅用2个数据帧尝试过此操作,其中每个字典中只有一个df,它确实给了我想要的结果,但是当我有2个以上的数据帧时,它似乎并没有做到这一点。

1 个答案:

答案 0 :(得分:0)

2个具有不同列的DataFrame的并集很简单,只需将缺少的列添加为null,然后调用unionAll

这是一个接受两个DataFrame并返回其并集的函数。 它假定两个DataFrame中都缺少列,但公共列必须具有相同的数据类型。

def union_dataframes(df1, df2):
    # use dict to preserve columns order, set does not
    cols1 = list(dict.fromkeys(df1.columns).keys())
    cols2 = list(dict.fromkeys(df2.columns).keys())
    merged_cols = list(dict.fromkeys(cols1 + cols2).keys())

    complete_cols1 = [col(c).alias(c) if c in cols1 else lit(None).alias(c) for c in merged_cols]
    complete_cols2 = [col(c).alias(c) if c in cols2 else lit(None).alias(c) for c in merged_cols]

    return df1.select(complete_cols1).unionAll(df2.select(complete_cols2))

然后,您可以将所有DataFrames放在列表中,并使用上述功能将其缩小:

list_df = [df1, df2, df3, ...] 
result_df = reduce(lambda a, b: union_dataframes(a, b), list_df)