Spark join引发“INNER join检测到笛卡尔积”错误

5
我有一个数据框,我想为每一行添加new_col=max(some_column0),并按照另一列的分组条件some_column1进行分组操作。
maxs = df0.groupBy("catalog").agg(max("row_num").alias("max_num")).withColumnRenamed("catalog", "catalogid")
df0.join(maxs, df0.catalog == maxs.catalogid).take(4)

在第二个字符串中,我遇到了一个错误:

分析异常:u“在逻辑计划之间的内部联接中检测到笛卡尔积\n项目...使用CROSS JOIN语法允许这些关系之间的笛卡尔积。”

我不理解的是:为什么Spark会在这里找到笛卡尔积?

出现此错误的可能原因:我将DF保存到Hive表中,然后重新初始化DF以从表中选择。或者将这两个字符串替换为Hive查询-无论如何都可以。但我不想保存DF。

3个回答

3

3
最好在您的回答中包含所有相关信息,而不仅仅是链接 - 链接可能会失效,但回答文本不会(希望如此)。 - CertainPerformance

3
尝试在连接数据框之前先持久化它们。这对我很有效。最初的回答。

1

我在联接时遇到了笛卡尔积的问题。为了克服这个问题,我在数据框上使用了别名。请参见以下示例:

from pyspark.sql.functions import col

df1.alias("buildings").join(df2.alias("managers"), col("managers.distinguishedName") == col("buildings.manager"))

似乎在Pyspark中使用别名可以工作,但在Scala DataFrame API中无法工作。 - Surender Raja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接