Допустим, у меня есть образец набора данных (таблица 1), как показано ниже —
Здесь один клиент может использовать несколько токенов, а один токен может использоваться несколькими клиентами. Я пытаюсь получить для каждого токена, клиента и даты создания записи количество клиентов, использовавших этот токен до даты создания.
Когда я пытаюсь выполнить этот запрос в Spark SQL, я получаю следующую ошибку:
Вариант 1 (коррелированный подзапрос)
SELECT
t1.token,
t1.customer_id,
t1.creation_date,
(SELECT COUNT(DISTINCT t2.customer_id) FROM Table 1 t2
AND t1.token = t2.token
AND t2.creation_date < t1.creation_date) cust_cnt
FROM Table 1 t1;
Ошибка: Коррелированный столбец не допускается в предикате, отличном от равенства.
Вариант 2 (перекрёстное соединение)
SELECT
t1.token,
t1.customer_id,
t1.creation_date,
COUNT(DISTINCT t2.customer_id) AS cust_cnt
FROM Table 1 t1, Table 1 t2
WHERE t1.token = t2.token
AND t2.creation_date < t1.creation_date
GROUP BY t1.token, t1.customer_id, t1.creation_date;
Проблема: длительный запрос, так как таблица 1 содержит миллионы строк.
Есть ли обходной путь (например, с использованием функции окна) для оптимизации этого запроса в Spark SQL? Примечание: оконные функции не допускают отдельного подсчета.