如何在公共列表列上连接两个PySpark DataFrame

m3eecexj  于 2023-11-16  发布在  Spark
关注(0)|答案(1)|浏览(159)

我有两个PySpark DataFrame,df 1和df 2,有一个名为“conditions”的列,其中包含字符串列表。我想根据“conditions”列中的公共元素连接这些DataFrame,其中一个DataFrame中的整个列表与另一个DataFrame中的整个列表匹配。
下面是数据结构的一个简化示例:
df1:
| ID|条件|
| --|--|
| User1| [“ABC”,“苹果”]|
| User2| [“香蕉”,“橙子”]|
| User3| [“樱桃”,“梨”]|
DF2
| 条件|重量|
| --|--|
| [“ABC”,“苹果”]| 10 |
| [香蕉]| 21 |
| [“樱桃”]| 15 |
| [“草莓”]| 30 |
| [“香蕉”,“橙子”]| 20 |
我想创建一个新的DataFrame,其中包含df 1和df 2中的行,其中“conditions”列表完全匹配。在本例中,预期输出为:
| ID|条件|重量|
| --|--|--|
| User1| [“ABC”,“苹果”]| 10 |
| User2| [“香蕉”,“橙子”]| 20 |
我试过了,但结果是错误的。
第一个月

z31licg0

z31licg01#

由于您正在比较两个数组列,因此可能会由于数组中项目的顺序不匹配而导致不正确的结果...例如['a', 'b'] != ['b', 'a']。为了解决这个问题,我们必须对数组中的不同元素进行排序,然后使用排序后的数组作为连接条件

  1. key = lambda c: F.array_sort(F.array_distinct(c))
  2. result = df1.join(df2, on=key(df1.conditions) == key(df2.conditions)).drop(df2.conditions)

个字符

相关问题