#sql #apache-spark-sql #subquery #sql-in
#sql #apache-spark-sql #подзапрос #sql-in
Вопрос:
У меня есть предложение where в Spark SQL, которое по какой-то причине не возвращает никаких записей. Я думаю, что это не работает, и поэтому я хотел бы спросить, что было бы эквивалентно этому?
SELECT
c.client_id,
current_date() as insert_date
FROM
CLIENT_SUB c
WHERE
(c.client_id, insert_date) not in (SELECT client_id, insert_date from CLIENT_SUBSCRIBER_CONTRACT)
Я слышал, что могу сделать это с помощью объединения
Ответ №1:
Я бы рекомендовал not exists
: это null
безопасно, в то время not it
как это не так, и обычно он также лучше масштабируется.
Я также с подозрением отношусь к ссылке на insert_date
: вы действительно это имеете в виду или вы действительно хотите current_date()
?
select cs.client_id, current_date() as insert_date
from client_sub cs
where not exists (
select 1
from client_subscriber_contract csc
where
csc.client_id = c.client_id
and csc.insert_date = cs.insert_date
-- or, maybe: csc.insert_date = current_date()
)
Для повышения производительности рассмотрим индекс on client_subscriber_contract(client_id, insert_date)
.
Комментарии:
1. Спасибо, ваше решение работает. У меня сложилось впечатление, что в spark индексация не поддерживается. Какую команду вы имели в виду?
Ответ №2:
Я подозреваю, что у вас есть нулевые значения в выходных данных вашего подзапроса, потому not in
что ничего не выводит при сопоставлении со значениями, содержащими нули. Попробуйте
not in (select client_id, insert_date
from CLIENT_SUBSCRIBER_CONTRACT
where coalesce(client_id, insert_date) is not null)
Я рекомендую изучить not exists
для вашей цели, хотя