如何在 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?

如何在 Oracle SQL 中查找最具体的匹配行

SQL Server的空值处理策略

如何使用Spark SQL 的JDBC server

sql server 中的 CTE (With table as) 在 hive 中等效吗?

如何从 SQL Server 中的表中获取不匹配的数据