spark join raise"检测到INNER join"的笛卡尔积。

时间:2017-02-10 08:12:09

标签: pyspark spark-dataframe apache-spark-2.0

我有一个数据框,我想为每一行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)

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

  

AnalysisException:u'检测到笛卡尔积之间的INNER连接   逻辑计划\ n项目...使用CROSS JOIN语法允许   这些关系之间的笛卡尔产品。'

我不明白:为什么火花会在这里发现笛卡尔积?

获取此错误的可能方法:我将DF保存到Hive表,然后再次从表中选择init DF。或者用hive查询替换这两个字符串 - 无论如何。但我不想保存DF。

3 个答案:

答案 0 :(得分:1)

Why does spark think this is a cross/cartesian join中所述,它可能是由于:

  

之所以发生这种情况,是因为您加入了共享相同血统的结构,并导致了一个平凡的条件。

关于笛卡尔积是如何产生的?您可以参考Identifying and Eliminating the Dreaded Cartesian Product

答案 1 :(得分:0)

对于我的联接,笛卡尔积也遇到了相同的问题。 为了克服它,我在DataFrames上使用了别名。参见示例

from pyspark.sql.functions import col

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

答案 2 :(得分:0)

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