希望快速提问。我仍然习惯了BASH的简短形式,我正在做一些非常愚蠢的语法,我只是没有看到它。所以任何帮助都会受到赞赏。
基本上我在12个月内从Hive中提取信息,但由于表格大小,我需要在几天内提取数据,例如7天。唯一的问题是因为天数可能不会平均分成最后一个循环周期需要确定剩余天数的一年。我试图在每个周期内进行检查: -
If (end date – start date) in days < 7 days then
query end date = query start date + (end date – start date) in days
else
query end date = query start date + 7 days
查询开始日期最初从12个月前开始,然后在每个循环周期内增加7天或上述语句剩下的任何天数。
如上所述,我的语法错误,加上日期加法/减法。我得到的错误消息很简单“语法不正确”,虽然我真的期待别的什么。据我所知,BASH没有任何简单的功能可以从另一个日期中减去一个日期来获取天数或者我错了吗?你是否介意快速浏览一下并指出我做错了什么?问题是回声的结束日期,更重要的是IF语句。
#Set dates dynamically
DT_START=$(date -d "-12 month -$(($(date +%-d)-1)) day" +%s)
DT_END=$(date -d "+1 days -$(($(date +%-d)-1)) day" +%s)
I_DAYS=7
#loop per set number of days with the 12 month period and insert into table
echo "$(date +%Y-%m-%d_%H:%M:%S): Last 12 month period is $(date -d"@${DT_START}" '+%Y-%m-%d') to $(date -d"-1 days @${DT_END}" '+%Y-%m-%d')";
while [ ${DT_START} -lt ${DT_END} ]; do
#increment date by either the set number of days or whatever days are left on the last increment
#date in string format for query range
DT_STR=$(date -d"@${DT_START}" +%Y-%m-%d)
if [ $(((${DT_END} - ${DT_START}) + 43200) / 86400) days -lt ${I_DAYS} ]; then
DT_STR_NEXT=$(date -d"${DT_STR}+$(( ((${DT_END}-${DT_START})+43200)/86400 )) days" +%Y-%m-%d);
else
DT_STR_NEXT=$(date -d"${DT_STR}+${I_DAYS} days" +%Y-%m-%d);
fi
hive_exec "
insert into table test
select col1, col2, col3
from foo
where actual_date >= '${DT_STR}'
and actual_date < '${DT_STR_NEXT}'";
DT_START=$(date -d"${DT_STR_NEXT}" +%s) #increment date for next loop
done
答案 0 :(得分:1)
您的语法错误来自
行if [ $(((${DT_END} - ${DT_START}) + 43200) / 86400) days -lt ${I_DAYS} ]; then
...因为days
作为test
表达式的一部分无效。由于你的意图不明确,很难说如何最好地改善这条线。
顺便说一下,由于你的shell是bash,你可以用更自然的数学上下文语法编写它(让你在大多数情况下使用<
而不是-lt
和elide扩展运算符):
if (( ( ( DT_END - DT_START + 43200 ) / 86400 ) < I_DAYS )); then
那就是说,你之前有其他错误,导致这一点。使用bash -x
运行脚本,您会看到以下内容:
++ date '-d-1 days @1414890352' +%Y-%m-%d
date: invalid date `-1 days @1414890352'
...对应第9行date
的使用错误。通常,在调试时使用set -x
是一个好主意。