Join 在DataFrame中联接多对多关系

Join 在DataFrame中联接多对多关系,join,pyspark,apache-spark-sql,pyspark-dataframes,Join,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有两个具有多对多关系的数据帧: df1 = spark.createDataFrame( [ (1000, 'kCode01', 'foo01'), (1000, 'kCode02', 'foo02'), (1001, 'kCode02', 'foo03'), (1002, 'kCode01', 'foo04'), ], ['tID', 'tSource01', 'tTarget01'] ) df2 =

我有两个具有多对多关系的数据帧:

df1 = spark.createDataFrame(
    [
        (1000, 'kCode01', 'foo01'),
        (1000, 'kCode02', 'foo02'),
        (1001, 'kCode02', 'foo03'),
        (1002, 'kCode01', 'foo04'),
    ],
    ['tID', 'tSource01', 'tTarget01']
)

df2 = spark.createDataFrame(
    [
        (1, ['foo01', 'foo99'], []),
        (2, ['foo02'], []),
        (3, ['foo99'], ['foo02', 'foo03']),
        (4, ['foo01', 'foo99'], ['foo02', 'foo99']),
    ],
    ['kID', 'kCode01', 'kCode02']
)

df1.show()
+----+---------+---------+
| tID|tSource01|tTarget01|
+----+---------+---------+
|1000|  kCode01|    foo01|
|1000|  kCode02|    foo02|
|1001|  kCode02|    foo03|
|1002|  kCode01|    foo04|
+----+---------+---------+

df2.show()    
+---+--------------+--------------+
|kID|       kCode01|       kCode02|
+---+--------------+--------------+
|  1|[foo01, foo99]|            []|
|  2|       [foo02]|            []|
|  3|       [foo99]|[foo02, foo03]|
|  4|[foo01, foo99]|[foo02, foo99]|
+---+--------------+--------------+
df.tSource01
的值是
df2
中的一列(在本例中为
kCode01
kCode02
)。另一方面,此列的值是一个列表,如果此列表包含
df.tTarget01
,我想加入它们。我是这样做的:

(df2
    .join(df1,
          ((col('tSource01') == 'kCode01') &
              expr('array_contains(kCode01, tTarget01)')) |
          ((col('tSource01') == 'kCode02') &
              expr('array_contains(kCode02, tTarget01)'))
         )
).select('kID', 'tID').show()
+---+----+
|kID| tID|
+---+----+
|  1|1000|
|  3|1000|
|  3|1001|
|  4|1000|
|  4|1000|
+---+----+
这正如预期的那样工作,但是我已经在那里硬编码了
df.tSource01
kCode01
kCode02
。我天真地试过这样做

(df2
    .join(df1,
          expr('array_contains(col(tSource01), tTarget01)'))
).select('kID', 'tID').show()
但是我得到了错误

Undefined function: 'col'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.
如何在不硬编码任何值的情况下实现这一点