Apache spark 规则优化器,用于在加入特定关系时注入合成合并键

Apache spark 规则优化器,用于在加入特定关系时注入合成合并键,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个定制的关系函数(我们称之为SPEC.relate(a,b)),我想用注入的规则优化它。我希望只是重写逻辑计划,而不是实现我自己的*Exec物理计划 鉴于以下情况 a.join(b,SPEC.relate(a.col(“SPEC\u字段”),b.col(“SPEC\u字段”)) a.spec_字段和b.spec_字段可以映射到一个或多个键(是的,键之间存在重复项) 优化后的版本看起来像这样 a_with_key=a.withColumn(“synth_key”,F.explode(SPE

我有一个定制的关系函数(我们称之为
SPEC.relate(a,b)
),我想用注入的规则优化它。我希望只是重写逻辑计划,而不是实现我自己的
*Exec
物理计划

鉴于以下情况

a.join(b,SPEC.relate(a.col(“SPEC\u字段”),b.col(“SPEC\u字段”))
a.spec_字段
b.spec_字段
可以映射到一个或多个键(是的,键之间存在重复项)

优化后的版本看起来像这样

a_with_key=a.withColumn(“synth_key”,F.explode(SPEC.generate_key_数组(“SPEC_字段”))
b_with_key=b.withColumn(“synth_key”,F.explode(SPEC.generate_key_数组(“SPEC_字段”))
带键的a_.join(带键的b_,“synth_键”)
.其中(SPEC.relate(a_与key.col(“SPEC_字段”),b_与key.col(“SPEC_字段”))
我的想法如下,但我不能完全弄清楚我需要做什么,以使它发生的逻辑计划

对象SpecRelateRule扩展规则[LogicalPlan]{
覆盖def应用(计划:LogicalPlan):LogicalPlan=plan.transform{
案例x@Join(左、右、joinType、条件@Some(SPEC.relate(leftExpr、righexpr)),提示)=>
//托多:我能做以下事情吗?
//leftKeys=left.withColumn(“synth_key”,F.explode(SPEC.generate_key_array(leftExpr)))
//rightKeys=right.withColumn(“synth_key”,F.explode(SPEC.generate_key_array(rightExpr)))
//joined=Join(leftKeys、rightKeys、joinType、condition、StrategyHint(“合并”、“合成键”))
//不知怎么掉了连接键
}
}

这里不是专家,但我不认为让它爆炸是个好主意。在没有1对多映射的情况下,分解仍然是计划的一部分,将被执行。根据Spec的功能,我建议将其分解为1:1映射。但我只是在猜,对。spec函数的实际实现只会在需要时扩展。这个例子只是为了说明问题的要点。