У меня есть простой запрос, который выполняется по большому набору данных.Чтобы избежать последовательного выполнения, я кеширую результат запроса и использую оптимизированный по искру логический план в качестве ключа кеша, а для сравнения ключей кеша я использую метод sameResult
на оптимизированном логическом плане.
Большинство запросов работаютвсе в порядке, но недавно я нашел простой запрос, для которого sameResult()
метод возвращает false.
Запрос
SELECT (CASE WHEN COUNT(`table`.`sales_nr`) > 1 THEN COUNT(`table`.`sales_nr`) ELSE NULL END) AS `c` FROM `db`.`table` `table`;
Сгенерированный план -
Aggregate [CASE WHEN (count(sales_nr#32) > 1) THEN count(sales_nr#32) ELSE null END AS a0#230L]
+- Project [sales_nr#32]
+- LogicalRDD [prod_name#29, sales_nr#32]
Яне уверен, почему метод sameResult () для простого плана не работает.
Ниже приведен еще один пример запроса, который работает нормально.
Запрос работает нормально
SELECT (CASE WHEN `table`.`prod_name` = 'a' THEN 1 ELSE 0 END) AS `c` FROM `db`.`table` `table` group by `table`.`prod_name`;
Sparkplan
Aggregate [prod_name#29], [CASE WHEN (prod_name#29 = a) THEN 1 ELSE 0 END AS a0#260]
+- Project [prod_name#29]
+- LogicalRDD [prod_name#29, sales_nr#32]
Я пытался отладить проблему, почему логические планы первого запроса не совпадают, используя sameResult()
, но не смог ничего найти.
Было бы здорово, если кто-то может мне помочьопределить проблему.Я использую Spark версии 2.1.