如何在pyspark中使用特殊条件连接两个数据框?



我有2个数据框,我想将它们与3列相连接。第一列有一个精确匹配如果df1的值不是NA,第二列有一个精确匹配。但是第三列不是精确匹配,它是包含:

如果df1中的col1df2中的col1具有相同的值,df1中的col3的元素包含在df2中的col3的元素中,如果df1中的col1不是NA并且df2中的col2具有相同的值,则将df1的行与df2连接(如果是NA,但其他两个条件都有效,则将它们匹配)。

例子df1:

col1     col2            col3
us        NA             amazon 
ca        Vancouver      Facebook
IN        Ottawa         IBM

df2:

col1     col2              col3
ca        Vancouver      /n Facebook us
IN        Boston         IBM
us        new york       amazon IN

输出:

ca        Vancouver      Facebook
us        new york       amazon
from pyspark.sql import functions as F
df1 = spark.createDataFrame(
[
('us',None,'amazon')
,('ca','Vancouver','Facebook')
,('IN','Ottawa','IBM')
],
['col1','col2','col3']
)
df2 = spark.createDataFrame(
[
('ca','Vancouver','/n Facebook us')
,('IN','Boston','IBM')
,('us','new york','amazon IN')
],
['col1','col2','col3']
)
df1.show()
df2.show()
# +----+---------+--------+
# |col1|     col2|    col3|
# +----+---------+--------+
# |  us|     null|  amazon|
# |  ca|Vancouver|Facebook|
# |  IN|   Ottawa|     IBM|
# +----+---------+--------+
# +----+---------+--------------+
# |col1|     col2|          col3|
# +----+---------+--------------+
# |  ca|Vancouver|/n Facebook us|
# |  IN|   Boston|           IBM|
# |  us| new york|     amazon IN|
# +----+---------+--------------+
df1
.join(df2, 'col1')
.withColumn('flag', F.when(df1.col2.isNull() & df2.col3.contains(df1.col3) , 1).
when(df1.col2 == df2.col2, 1).otherwise(0))
.filter(F.col('flag') == 1)
.select(df1.col1, df2.col2, df1.col3)
.show()
# +----+---------+--------+
# |col1|     col2|    col3|
# +----+---------+--------+
# |  ca|Vancouver|Facebook|
# |  us| new york|  amazon|
# +----+---------+--------+

相关内容

  • 没有找到相关文章

最新更新