Spark: эквивалентно не в

#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 для вашей цели, хотя