Есть ли какой-либо надежный и эффективный способ гарантировать, что результаты запроса impala полностью материализуются без результатов печати на консоль? В качестве примера я буду использовать запрос INNER JOIN.Убедитесь, что запрос Impala стал материализованным.
Очевидным способом материализовать результаты запроса является create table as select.
CREATE TABLE t3 STORED AS PARQUET AS SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id;
Проблема с ним в том, что он пишет на диск, следовательно, является неэффективным. Я ищу наиболее эффективный способ выполнить запрос и обеспечить, чтобы результаты были реализованы.
В качестве примера, в Spark я могу использовать метод .cache
, за которым следует .count
, чтобы гарантировать, что запрос материализуется.
val t3 = t1.join(t2, "id")
t3.cache
t3.count
Я мог бы попытаться обойти с подзапроса.
SELECT COUNT(*) FROM (SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id) t3;
Но все-таки мне нужно обеспечить подзапрос материализуется, который не является очевидным, если оптимизатор запросов обнаруживает, что я заинтересован только в общем количестве. Может быть, есть какие-то намеки для обеспечения того или иного трюка?
Вы хотите, чтобы запрос был материализован, но вы не хотите, чтобы запрос был материализован (т. Е. Данные сохранялись на диске). Я вижу там какое-то противоречие. Или, может быть, вы просто хотите подчеркнуть - протестировать демонов Impala, просто чтобы посмотреть, в какой момент они сдаются с OOM? –
Иными словами: Impala - это механизм выполнения SQL, а не структура обработки данных (* à la * Spark), а не распределенный кеш (* à la * Redis). Когда запрос был выполнен, ничего не остается. За исключением нескольких журналов. –
@SamsonScharfrichter спасибо за комментарий, во многих sql db вы можете сохранять результаты запроса в переменную на разовой основе и повторно использовать ее дальше. Если бы у импалы была такая особенность, это решило бы мое дело. Я хочу материализовать запрос, но я не хочу иметь накладные расходы на передачу/печать, поэтому 'select count (*)' внешний запрос - намного лучше, чем * create table as select *. Я не думаю, что есть противоречие. Просто точное время выполнения запроса на стороне сервера. – jangorecki