我有这些table:
df1 df2
+---+------------+ +---+---------+
| id| many_cols| | id|criterion|
+---+------------+ +---+---------+
| 1|lots_of_data| | 1| false|
| 2|lots_of_data| | 1| true|
| 3|lots_of_data| | 1| true|
+---+------------+ | 3| false|
+---+---------+
我打算在 df1
:
+---+------------+------+
| id| many_cols|result|
+---+------------+------+
| 1|lots_of_data| 1|
| 2|lots_of_data| null|
| 3|lots_of_data| 0|
+---+------------+------+
``` `result` 应该是 `1` 如果有相应的 `true` 在
df2 `result` 应该是 `0` 如果没有相应的 `true` 在
df2 `result` 应该是 `null` 如果没有相应的 `id` 在 `df2` 我想不出一个有效的方法来做这件事。在加入后,我只能满足第三个条件:
df = df1.join(df2, 'id', 'full')
df.show()
+---+------------+---------+
| id| many_cols|criterion|
+---+------------+---------+
| 1|lots_of_data| false|
| 1|lots_of_data| true|
| 1|lots_of_data| true|
| 3|lots_of_data| false|
| 2|lots_of_data| null|
+---+------------+---------+
PyparkDataframe的创建方式如下:
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
spark = SparkSession.builder.getOrCreate()
df1cols = ['id', 'many_cols']
df1data = [(1, 'lots_of_data'),
(2, 'lots_of_data'),
(3, 'lots_of_data')]
df2cols = ['id', 'criterion']
df2data = [(1, False),
(1, True),
(1, True),
(3, None)]
df1 = spark.createDataFrame(df1data, df1cols)
df2 = spark.createDataFrame(df2data, df2cols)
4条答案
按热度按时间avkwfej41#
一个简单的方法就是分组
df2
以获得最大值criterion
由id
加入df1
,这样可以减少要连接的行数。如果至少有一个对应的真值,则布尔列的最大值为真:cunj1qz12#
您可以尝试使用相关子查询从df2获取最大布尔值,并将其转换为整数。
1zmg4dgp3#
看看这个解决方案。加入后。您可以根据需要使用多个条件检查,并使用when子句相应地指定值,然后按id和其他列获取结果分组的最大值。如果只对分区使用just id,也可以使用window函数来计算结果的最大值。
使用窗口函数
jbose2ul4#
为了得到最适合我的解决方案,我不得不把提出的答案的想法合并起来。