我有2个数据框,我想将它们与3列相连接。第一列有一个精确匹配如果df1
的值不是NA
,第二列有一个精确匹配。但是第三列不是精确匹配,它是包含:
如果df1
中的col1
和df2
中的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|
# +----+---------+--------+