#sql #hive #hiveql #ranking
#sql #улей #hiveql #Рейтинг
Вопрос:
У меня есть :
таблица теста содержит :
unique_id string , file_name string , mount bigint
образец даты :
uniqu_id , file_name , mount 1 , test.txt , 15 1 , test_R_file.txt , 50 3 , test_567.txt , 30 3 , test_567_R_file.txt , 100
что я хочу сделать :
Мне нужен запрос для вставки перезаписи таблицы, в которой мне нужно сохранить для каждого дублированного uniqu_id одну запись, и эта запись должна быть той, которая имеет (R в столбце имя файла)
проблема :
тест таблицы extrnal таблицы в Hive (что означает, что она не поддерживает Update и delete операция ) поэтому я хочу, чтобы вставить перезаписать, чтобы удалить дубликаты записей для каждого uniqu_id в таблице (в случае, если у меня есть 2 записи за тот же unique_id только запись (Р) в имени файла запись должна остановиться ) , Я думаю, что в использовании рейтинге, но идея меня нет столбца для заказа на это знал, что запись я должен вести и какие записи я должен удалить я просто имя_файла столбец, который я должен проверить его, в случае у меня есть 2 записи имеет тот же unique_id, чтобы знал, какие записи следует сохранить, а какие следует удалить
Ответ №1:
Вы можете сортировать по логическому выражению, существует ли R в имени файла или нет, используя выражение РЕГИСТРА. Также вы можете преобразовать логическое значение в int в СЛУЧАЕ и добавить дополнительные условия в СЛУЧАЕ, а также добавить дополнительные выражения orderby, разделенные запятыми. Вы можете сортировать по логическому значению, потому что True больше, чем False.
ДЕМОНСТРАЦИЯ:
with mytable as (--demo dataset, use your table instead of this CTE select 1 unique_id , 'test.txt' file_name , 15 mount union all select 1 , 'test_R_file.txt' , 50 union all select 3 , 'test_567.txt' , 30 union all select 3 , 'test_567_R_file.txt' , 100 ) select unique_id, file_name, mount from ( select unique_id, file_name, mount, row_number() over(partition by unique_id order by file_name rlike '_R_' desc --True is greater than False --order by something else if necessary ) rn from mytable t ) s where rn=1
Результат:
unique_id file_name mount 1 test_R_file.txt 50 3 test_567_R_file.txt 100
Используйте rank
вместо row_number
, если возможно несколько записей с R на уникальный идентификатор, и вы хотите сохранить их все. Ранг присвоит 1 всем записям с R, row_number присвоит 1 единственной такой записи на уникальный идентификатор.