Подсчет улья по разделу на в случае, когда

#hive #hiveql

#улей #hiveql

Вопрос:

У меня есть два запроса:

 select count(*) over (partition by col1) from t1
  

и

 select case when count(*) over (partition by col1) >1 then 1 else 0 end from t1
  

Первый работает нормально. Второй, однако, вызывает ошибку:

 Invalid column reference 'count': (possible column names are: <all columns in t1>)
  

Ввод любого имени столбца вместо * in count приводит к тому же поведению.

В чем причина проблемы? Я не нашел никаких ограничений в dosc для case when и over partition by вместе.

Комментарии:

1. Я не думаю, что это возможно сделать в Hive, но поиск СООТВЕТСТВУЕТ ТРЕБОВАНИЯМ. issues.apache.org/jira/browse/HIVE-7660

2. @deusxmach1na Я не думаю, что это одно и то же — qualify — это в некотором роде предложение where. Здесь я просто хочу значения в выборе.

3. математика на помощь select ROUND((count(*) over (partition by col1) - 1) / count(*) over (partition by col1)) from t1

4. @deusxmach1na Спасибо, это умно. Тем не менее, мне все еще любопытно, почему это не работает напрямую…

5. Если бы мне пришлось догадаться, что это функция, которую они еще не реализовали, или ошибка. Кстати, я только что попробовал это с помощью IF, и это работает: select IF(count(*) over (partition by col1) > 1, 1, 0) from t1

Ответ №1:

Попробуйте это:

 select COUNT(CASE WHEN >1 THEN 1 ELSE 0 END) over (partition by col1) from t1;
  

Комментарии:

1. Это не работает, и я не понимаю, почему это должно быть: > бинарный оператор is , поэтому ему нужно что-то с обеих сторон.