#sql #apache-spark-sql
Вопрос:
Пожалуйста, найдите приведенный ниже запрос. Столбец раздела имеет нулевые значения, и я тоже хочу игнорировать нулевые значения при выполнении last_value в столбце раздела.
select * from (
select col1, col2,state_time,
coalesce (CASE WHEN ra.col2 ='' THEN NULL ELSE col2 end,
last_value (col2) IGNORE NULLS OVER
(partition by col1 order by state_time ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING )
) as job_icims_id_der
from delta_source_db.recruiting_activity ra
order by state_time desc) inq where col1 is null
and col2 is null and job_icims_id_der is not null order by state_time
limit 10
Комментарии:
1. И в чем проблема с вашим запросом?
2. Вы не можете игнорировать некоторые значения при разбиении на разделы, потому что каждая входная строка должна быть назначена какому-либо разделу. Что вы ожидаете получить в результате аналитической функции для таких игнорируемых строк? В любом случае вы можете использовать или не использовать вычисленный результат для любой заданной строки в зависимости от других столбцов (независимо от того, является ли этот столбец разделом или нет). Или, пожалуйста, предоставьте более подробную информацию о том, чего вы пытаетесь достичь, предпочтительно с исходными данными и желаемыми результатами в текстовом формате.
Ответ №1:
В SparkSQL флаг игнорирования является вторым аргументом, как и в:
last_value(col2, true) over
(partition by col1
order by state_time
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) as job_icims_id_der
Я обычно рекомендую first_value()
для этой логики, хотя:
first_value(col2, true) over
(partition by col1
order by state_time desc
) as job_icims_id_der
Для этого не требуется спецификация оконной рамы.