我有一个数据框,我想为每一行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。
答案 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)
在加入数据框之前尝试保留它们。为我工作。