火花联接提高"Detected cartesian product for INNER join"



我有一个数据帧,我想为每一行添加new_col=max(some_column0)按其他列1分组:

maxs = df0.groupBy("catalog").agg(max("row_num").alias("max_num")).withColumnRenamed("catalog", "catalogid")
df0.join(maxs, df0.catalog == maxs.catalogid).take(4)

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

分析异常:u'检测到 INNER 连接的笛卡尔积 逻辑计划项目...使用 CROSS JOIN 语法允许 这些关系之间的笛卡尔乘积。

我不明白的是:为什么火花在这里找到笛卡尔乘积?

出现此错误的一种可能方法:我将 DF 保存到 Hive 表,然后再次初始化 DF 作为从表中选择。或者用 hive 查询替换这 2 个字符串 - 没关系。但我不想拯救DF。

如 为什么 Spark 认为这是一个交叉/笛卡尔连接中所述,它可能是由以下原因引起的:

发生这种情况是因为您加入了共享相同谱系的结构,这会导致一个平凡相等的条件。

至于笛卡尔乘积是如何产生的?您可以参考识别和消除可怕的笛卡尔乘积。

尝试在加入数据帧之前保留数据帧。为我工作。

我在连接时遇到了同样的笛卡尔积问题。为了克服它,我在数据帧上使用了别名。查看示例

from pyspark.sql.functions import col
df1.alias("buildings").join(df2.alias("managers"), col("managers.distinguishedName") == col("buildings.manager"))

相关内容

  • 没有找到相关文章

最新更新