我有两个数据
。
A可能有一些'q1','q2','q3‘不在b中,b也可能有一些'q1','q2','q3’不在a中。
合并的意思是,如果a有'q1','q2','q3‘与b相同,则加入行,然后合并左行。full outer join不做这种事。
我的预写代码是:
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')) )但这是非常没有效率的。
还有更好的办法吗?
发布于 2019-12-03 07:00:00
我忘了解决这个问题。
实际上,full outer join是正确的方法。但是在spark中有一个相关的bug,在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:并不是所有的数据集都发生了这种情况,我创建了一些数据进行测试,但是无法复制。
发布于 2019-11-11 09:57:25
我假设您希望通过以下方法实现left-outer连接:
df1.join(df2, on=['q1', 'q2', 'q3'], "left_outer")

https://stackoverflow.com/questions/58798216
复制相似问题