как удалить дублирующиеся записи, зависит от столбца, который не может быть отсортирован в улье

#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 единственной такой записи на уникальный идентификатор.