首页 > 解决方案 > spark如何在几列上合并两个数据框?

问题描述

我有两个数据框

a 可能有一些 ['q1', 'q2', 'q3'] 不在 b 中,b 也可能有一些 ['q1', 'q2', 'q3'] 不在 a 中。

合并意味着,如果 a 有 ['q1', 'q2', 'q3'] 与 b 相同,则加入 rows ,然后联合 left rows 。full outer join不做这样的事情。

我的 presudo 代码是这样的:

c = a.join(b, on= ['q1', 'q2', 'q3'], how='inner')
c = c.union(a.filter( ~a.withColumn('xxx', F.concat_ws('|', 'q1', 'q2', 'q3') ).isin(c.select(F.concat_ws('|', 'q1', 'q2', 'q3')) )
c = c.union(b.filter( ~b.withColumn('xxx', F.concat_ws('|', 'q1', 'q2', 'q3') ).isin(c.select(F.concat_ws('|', 'q1', 'q2', 'q3')) )

但这是非常低效的。

有没有更好的办法?

标签: apache-sparkmergepysparkapache-spark-sql

解决方案


我忘了解决这个问题。

其实full outer join是正确的方法。但是 spark 中有一个相关的错误,在 2.1 版本中标记为已解决,但我在 2.4.0 中遇到了。

在完全外部联接之前进行内部联接时的意外结果:

df1 = spark.parquet.read(...)
df2 = spark.parquet.read(...)
df3 = spark.parquet.read(...)
df4 = spark.parquet.read(...)
df5 = spark.parquet.read(...)

store_product =  spark.parquet.read(...)

df1 = df1.join(store_product, on=['store_id', 'product_id'], how='inner')

dfs = [df1,df2,df3,df4,df5,]

df = full_outer_join_all(dfs)

将内部联接移到完全外部正确的后面:

df1 = spark.parquet.read(...)
df2 = spark.parquet.read(...)
df3 = spark.parquet.read(...)
df4 = spark.parquet.read(...)
df5 = spark.parquet.read(...)

store_product =  spark.parquet.read(...)


dfs = [df1,df2,df3,df4,df5,]

df = full_outer_join_all(dfs)

df = df.join(store_product, on=['store_id', 'product_id'], how='inner')

PS:并非所有数据集都发生这种情况,我创建了一些数据进行测试但无法重现。


推荐阅读