Impala: Логично ли разделить запрос на соединение с условием ИЛИ на два запроса?

У меня есть приведенная ниже структура запроса, которую я использую для выполнения Impala , которая заняла более 20 часов и не закончилась:

      INSERT INTO Final_table
with t1
AS
(SELECT account_id, request_id, status_1
 FROM table_1
 WHERE status_1 = "20"
),
t2 AS
(
 SELECT account_id, request_id, status_2
 FROM table_2
 WHERE status_2 = "10"
)
SELECT t2.account_id, t2.request_id, t2.status_1, t1.status_2
FROM t1
INNER JOIN t2
ON (t1.account_id = t2.account_id OR t1.request_id = t2.request_id);

Проблема как раз в условии «ИЛИ» в операторе ON, потому что количество записей, полученных отдельно от t1, составляет около 14M, а от t2 отдельно — около 15M записей. Поскольку я столкнулся с проблемой памяти, я взял подзапросы t1 и t2, выполнил их отдельно и сохранил в новых таблицах. а затем выполнил соединение на основе следующего:

      CREATE TABLE sub_table_1
AS
 SELECT account_id, request_id, status_1
 FROM table_1
 WHERE status_1 = "20"
      CREATE TABLE sub_table_2
AS
 SELECT account_id, request_id, status_2
 FROM table_2
 WHERE status_2 = "10"
      INSERT INTO Final_table
SELECT t2.account_id, t2.request_id, t2.status_1, t1.status_2
FROM sub_table_1 AS t1
INNER JOIN sub_table_2 AS t2
ON (t1.account_id = t2.account_id OR t1.request_id = t2.request_id);

Подтаблицы были успешно созданы, но при окончательном объединении все еще возникает та же проблема. Будет ли логично, если я выполняю соединение в два шага, каждый шаг с одним из условий, а затем соединяю два результата? Или если будет другой метод помощи?

1 ответ

Вы можете использовать СОЮЗ

  1. Получить результат от первого соединения (результат)

2.result UNION result2 из 2-го условия соединения

SELECT * FROM t1 JOIN t2 ON t1.account_id = t2.account_id UNIONSELECT * FROM t1 JOIN t2 ON t1.request_id = t2.request_id

Другие вопросы по тегам