如何在 Hive 中匹配 SQL Server 函数
Posted
技术标签:
【中文标题】如何在 Hive 中匹配 SQL Server 函数【英文标题】:How to match SQL server functions in Hive 【发布时间】:2019-07-11 20:34:03 【问题描述】:我正在尝试在 Hive 中编写等效于 SQL 的存储过程。我设法翻译了前两个:
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;
有什么想法或建议吗?
【问题讨论】:
能否请您更详细地描述您的要求,并在问题中添加更多关于期望的详细信息。谢谢 C_II.Common.FN_COM_DATEToYearMonth 这看起来像是特定于您的项目的一些用户功能。你能解释一下它的作用吗? 您还计算了 yearMonth 并且没有在以后的语句中使用它。您在最终变量 startYearMonth 中期望哪个日期或值?是2018-04-30吗??请确认。 我希望我能够满足要求。 :-) 【参考方案1】:您的要求在问题中不是很清楚。此外,这个函数 'C_II.Common.FN_COM_DATEToYearMonth' 似乎是特定于您的项目的,它不是标准的 sql server 函数。
让我们逐步分解它:
如果我们在 sql server 中运行以下语句:
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 server 的正确和等效覆盖为:
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
回答您的问题: 创建一个 hive 脚本并将其保存在您的 hdfs 位置。(testdatehive.hql)
select date_format('$hiveconf:anchor_dt','yyyy-MM');
select date_format(add_months('$hiveconf:anchor_dt',-$hiveconf:reloadMonths+1),'yyyy-MM');
Shell 脚本:
#!/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"
这是你的 shell 输出:
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
让我知道这是否有效。
【讨论】:
以上是关于如何在 Hive 中匹配 SQL Server 函数的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何在java jdbc中使用sqoop从sql server导入hive?