Apache Flink - включить порядок объединения - PullRequest
0 голосов
/ 03 декабря 2018

Я заметил, что Apache Flink не оптимизирует порядок объединения таблиц.На данный момент он поддерживает указанный пользователем порядок соединения (в основном он принимает запрос буквально).Я полагаю, что Apache Calcite может оптимизировать порядок соединений, но по некоторым причинам эти правила не используются в Apache Flink.

Если, например, у нас есть две таблицы ' R ' и' S '

private val tableEnv: BatchTableEnvironment = TableEnvironment.getTableEnvironment(env)
private val fileNumber = 1
tableEnv.registerTableSource("R", getDataSourceR(fileNumber))
tableEnv.registerTableSource("S", getDataSourceS(fileNumber))
private val r = tableEnv.scan("R")
private val s = tableEnv.scan("S")

, и мы предполагаем, что ' S ' пусто, и мы хотим объединить эти таблицы двумя способами:

val tableOne = r.as("x1, x2").join(r.as("x3, x4")).where("x2 === x3").select("x1, x4")
        .join(s.as("x5, x6")).where("x4 === x5 ").select("x1, x6")


val tableTwo = s.as("x1, x2").join(r.as("x3, x4")).where("x2 === x3").select("x1, x4")
          .join(r.as("x5, x6")).where("x4 === x5 ").select("x1, x6")

Если мы хотим посчитать количество строк в tableOne и в tableTwo , результат будет нулевым в обоих случаях.Проблема в том, что оценка tableOne займет намного больше времени, чем оценка tableTwo .

Есть ли способ, с помощью которого мы можем автоматически оптимизировать порядок выполнения объединенияили даже включить возможную операцию по планированию затрат, добавив некоторую статистику?Как можно добавить эту статистику?

В документации по этой ссылке написано, что, возможно, необходимо изменить среду таблицы CalciteConfig, но мне не понятно, как это сделать.Это.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 04 декабря 2018

Изменение порядка объединения не включено, поскольку Flink плохо обрабатывает статистику.Изменение порядка соединений без каких-либо точных оценок кардинальности - это в основном азартная игра.Поэтому переупорядочение соединений отключено, и таблицы объединяются в порядке, указанном пользователем.Это дает детерминистическое и управляемое поведение.

Однако вы можете передать правила оптимизации в оптимизатор, передав TableConfig с CalciteConfig при создании TableEnvironment, т. Е. TableEnvironment.getTableEnvironment (env,yourTableConfig).В CalciteConfig вы можете добавлять правила оптимизации для разных этапов оптимизации.Возможно, вы захотите добавить JoinCommunteRule и JoinAssociateRule к этапу логической оптимизации.Возможно, вам также придется покопаться в коде, чтобы проверить, как передавать статистику в оптимизатор.

...