报错信息:
Detected cartesian product for INNER join between logical plans
情景:
spark 2.4.0
我们用一张表一个父节点字段,实现了一个多级的树状结构
现在一个需求,需要找到所有叶子节点的第一级树枝是谁。
其实数量不多,用java很简单的一个需求。用spark写了,,现在觉得脑子有坑
一张表,自己innner join自己 on parent = id
然后再来一次,就是3级目录了。更多级,就增加一次。,,,再次,用递归好容易的。。。
然后报错了,spark认为我这个语句发生了笛卡尔积~。。
然后 百度了一下,说alias就可以防止笛卡尔积了:
df1 = ****.load()
df2 = df1.alias()
df1.join(df2,df1("col1") === df2("col2")).select().explain()
打出来,依旧使用了笛卡尔积
然后改成了这样
df1 = ****.load().alias("df1")
df2 = ****.load().alias("df2")
df3 = df1.join(df2,df1("col1") === df2("col2")).select().alias("df3")
df3.join(df1,df3("col1") === df1("col2").select().expain()
没问题。。。。用的inner join
前一次的line3和后一次的line4本质上没有区别,但是逻辑计划生成完全不一样……
记录问题,。用的