如何使用自定义规则扩展Spark Catalyst优化器?

时间:2016-03-22 10:41:01

标签: apache-spark apache-spark-sql

我想使用Catalyst规则将星型模式(https://en.wikipedia.org/wiki/Star_schema)SQL查询转换为SQL查询到非规范化星型模式,其中维度表中的某些字段在事实表中表示。 我试图找到一些扩展点来添加自己的规则来进行上述转换。但我没有找到任何扩展点。所以有以下问题:

  1. 如何将自己的规则添加到催化剂优化器?
  2. 是否有其他解决方案来实现上述功能?

2 个答案:

答案 0 :(得分:4)

根据@Amble建议,您可以使用sparkSession.experimental.extraStrategies将您的功能添加到SparkPlanner

简单打印" Hello world"在控制台上

object MyStrategy extends Strategy {
  def apply(plan: LogicalPlan): Seq[SparkPlan] = {
    println("Hello world!")
    Nil
  }
}

以示例运行:

val spark = SparkSession.builder().master("local").getOrCreate()

spark.experimental.extraStrategies = Seq(MyStrategy)
val q = spark.catalog.listTables.filter(t => t.name == "five")
q.explain(true)
spark.stop()

您可以在朋友的GitHub上找到一个有效的示例项目:https://github.com/bartekkalinka/spark-custom-rule-executor

答案 1 :(得分:2)

作为线索,现在在Spark 2.0中,您可以通过extraStrategies导入extraOptimizationsSparkSession.experimental