首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在几个列上合并两个数据文件?

如何在几个列上合并两个数据文件?
EN

Stack Overflow用户
提问于 2019-11-11 08:57:26
回答 2查看 289关注 0票数 0

我有两个数据

  • a列:'q1‘、'q2’、'q3‘、'a1’、'a2'
  • b列:'q1‘、'q2’、'q3‘、'b’、'b2'

A可能有一些'q1','q2','q3‘不在b中,b也可能有一些'q1','q2','q3’不在a中。

合并的意思是,如果a有'q1','q2','q3‘与b相同,则加入行,然后合并左行。full outer join不做这种事。

我的预写代码是:

代码语言:javascript
复制
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')) )

但这是非常没有效率的。

还有更好的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-03 07:00:00

我忘了解决这个问题。

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

当内部连接在完全外部连接之前,出现意外的结果:

代码语言:javascript
复制
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)

移动内部连接后完全外部正确:

代码语言:javascript
复制
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:并不是所有的数据集都发生了这种情况,我创建了一些数据进行测试,但是无法复制。

票数 1
EN

Stack Overflow用户

发布于 2019-11-11 09:57:25

我假设您希望通过以下方法实现left-outer连接:

代码语言:javascript
复制
df1.join(df2, on=['q1', 'q2', 'q3'], "left_outer")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58798216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档