Как сопоставить функции сервера SQL в Hive - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь написать хранимую процедуру для SQL-эквивалента в Hive.Мне удалось перевести первые два:

DECLARE @ReloadMonths as INT=15

set reloadMonths=15


DECLARE @Anchor_DT as DATE =EOMONTH(Getdate(),-1);

set anchor_dt=select last_day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')`)

Но у меня возникли проблемы с переводом следующих двух:

DECLARE @YearMonth as INT=C_II.Common.FN_COM_DATEToYearMonth(@Anchor_DT);

set yearMonth=(anchor_dt,'yyyy-MM')

DECLARE @StartYearMonth as INT =ISNULL(@StartYearMonth_Inp,C_II.Common.FN_COM_DATEToYearMonth(DATEADD(MM,-@ReloadMonths+1,@Anchor_DT)));

set startYearMonth=${hiveconf:${hiveconf:startYearMonth}};

Есть идеи или предложения?

1 Ответ

1 голос
/ 28 июля 2019

ваши требования не очень понятны в вопросе.Также кажется, что эта функция 'C_II.Common.FN_COM_DATEToYearMonth' специфична для вашего проекта и не является стандартной функцией сервера sql.

Позволяет разбить ее поэтапно:

Если мы запустимнижеприведенные операторы на сервере sql:

DECLARE @Anchor_DT as DATE =EOMONTH(Getdate(),-1);
select @Anchor_DT;

Дата будет указана как: 2019-06-30, тогда как преобразование улья, которое вы для этого сделали, неверно.

select last_day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))

Это дастпоследний день текущего месяца - «2019-07-31», поэтому правильное и эквивалентное покрытие для сервера sql будет выглядеть следующим образом:

select DATE_SUB(current_date(),DAY(current_date()));

Дата будет возвращена как: «2019-06-30».

Последние два утверждения в вашем вопросе были не очень ясны, но похоже, что вы ожидаете ниже конверсии.

select date_format('${hiveconf:anchor_dt}','yyyy-MM');

Он вернется как: 2019-06

"DECLARE @StartYearMonth as INT =ISNULL(@StartYearMonth_Inp,C_II.Common.FN_COM_DATEToYearMonth(DATEADD(MM,-@ReloadMonths+1,@Anchor_DT)));"

Я преобразовал вышеупомянутое утверждение в sql server, как показано ниже:

select format((DATEADD(MM,-@ReloadMonths+1,@Anchor_DT)),'yyyy-MM');

Это вернет дату в sql server как: 2018-04

Ответ на ваш вопрос: создайте скрипт ульяи сохраните его в папке hdfs. (testdatehive.hql)

select date_format('${hiveconf:anchor_dt}','yyyy-MM');
select date_format(add_months('${hiveconf:anchor_dt}',-${hiveconf:reloadMonths}+1),'yyyy-MM');

Сценарий оболочки:

#!/bin/bash

#Declare integer variable
declare -i reloadMonths=15
echo $reloadMonths

echo "Executing the hive query - get anchor date and store it in shell variable"

anchor_dt=$(hive -e "select DATE_SUB(current_date(),DAY(current_date()));")
echo $anchor_dt

echo "Pass anchor_date & reloadMonths to hive script"

hive --hiveconf anchor_dt=$anchor_dt --hiveconf reloadMonths=$reloadMonths -f hdfs://hostname/user/vikct001/dev/hadoop/hivescripts/testdatehive.hql

echo "Executing the hive query - ends"

Вот ваш вывод оболочки:

15
Executing the hive query - get anchor date and store it in shell variable
2019-06-30
Pass anchor_date & reloadMonths to hive script
2019-06
2018-04

Дайте мне знать, если это работает.

...