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'.
如何在不硬编码任何值的情况下实现这一点