#sql #hive #hiveql
#sql #улей #hiveql
Вопрос:
Я столкнулся с некоторой проблемой с кодом hive. Мой FROM TABLE
разделен на основе месяца, года и дня. Я придумал следующий код, чтобы получить нужные мне данные. Логика примерно такая: если текущее значение mth
равно 01
, то измените month
значение на 12, а год на yr - 1
, иначе измените месяц на mth - 1
и оставьте год как есть.
set hivevar:yr=2019;
set hivevar:mth=03;
set hivevar:dy=29;
SELECT * from
FROM table
WHERE
month = case when cast('${mth}' as int) = 01 then 12 else cast((cast('${mth}' as int) - 1) as string) end
AND year = case when cast('${mth}' as int) = 01 then cast((cast('${yr}' as int) - 1) as string) else '${yr}' end;
Это не работает, my select *
приходит пустым. Пожалуйста, помогите.
Комментарии:
1. можете ли вы описать на английском языке, что вы пытаетесь получить из таблицы с заданной датой?
2. @VamsiPrabhala Я хочу получить данные за последний месяц на основе текущего месяца и года. например, если месяц 03 (2019), мне нужны данные за 02 (2019). Если текущий месяц равен 01 (2019), то мне нужны данные за 12 (2018).
3. есть ли в таблице столбец даты или это только месяц, год и дата в виде отдельных столбцов?
4. Можете ли вы предоставить свою структуру таблицы? Если вы измените ‘$ {mth}’, скажем, на 05, и ‘$ {yr}’ на 2019, ваш запрос сработает?
5. @VamsiPrabhala нет. Она разбита на разделы в зависимости от месяца, года и дня.
Ответ №1:
Насколько я понимаю, вы пытаетесь получить данные за предыдущий месяц с указанием даты. Если это так, вы можете использовать встроенные функции даты для этого.
select *
from table
where concat_ws('-',year,month,day) >= add_months(date_add(concat_ws('-','${yr}','${mth}','${dy}'),1-'${dy}'), -1)
and concat_ws('-',year,month,day) < date_add(concat_ws('-','${yr}','${mth}','${dy}'),1-'${dy}')
Решение предполагает, что год, месяц и день имеют формат гггг, ММ и дд. Если нет, скорректируйте их по мере необходимости
Кроме того, вам следует рассмотреть возможность сохранения date
в виде столбца, даже если он разделен по годам, месяцам и дням.
Комментарии:
1. Использование разделов может помочь запросу выполняться быстрее, вот почему я не был склонен использовать встроенные функции. И я не могу использовать DDL таблиц prod. :'( Я пытался придумать что-нибудь еще, чтобы сделать то же самое.
2. Я знаю .. вот почему я сказал в дополнение к разделенным столбцам