下面是我的shell脚本,我试图调用一些正常工作的hive SQL查询。
#!/bin/bash
DATE_YEST_FORMAT1=`perl -e 'use POSIX qw(strftime); print strftime "%Y-%m-%d",localtime(time()- 3600*504);'`
echo $DATE_YEST_FORMAT1
hive -e "
SELECT t1 [0] AS buyer_id
,t1 [1] AS item_id
,created_time
FROM (
SELECT split(ckey, '\\\\|') AS t1
,created_time
FROM (
SELECT CONCAT (
buyer_id
,'|'
,item_id
) AS ckey
,created_time
FROM dw_checkout_trans
WHERE to_date(from_unixtime(cast(UNIX_TIMESTAMP(created_time) AS BIGINT))) = '$DATE_YEST_FORMAT1' distribute BY ckey sort BY ckey
,created_time DESC
) a
WHERE rank(ckey) < 1
) X
ORDER BY buyer_id
,created_time DESC;"
sleep 120
QUERY1=`hive -e "
set mapred.job.queue.name=hdmi-technology;
SELECT SUM(total_items_purchased), SUM(total_items_missingormismatch) from lip_data_quality where dt='$DATE_YEST_FORMAT2';"`
问题陈述: -
如果您在hive -e
之后看到我的第一个echo $DATE_YEST_FORMAT1
阻止。有时该查询由于某些原因而失败。所以目前发生的情况是,如果first Hive SQL query
失败,那么在为second Hive SQL query
休眠后它会转到120 seconds
。这就是我不想要的东西。那么如果first query
由于任何原因而失败,有没有办法,那么它应该得到stopped automatically
。它应该在几分钟后从启动开始自动运行(应该可配置)
更新: -
正如Stephen
所建议的那样。
我尝试过这样的事情 -
#!/bin/bash
hive -e " blaah blaah;"
RET_VAL=$?
echo $RET_VAL
if [ $RET_VAL -ne 0]; then
echo "HiveQL failed due to certain reason" | mailx -s "LIP Query Failed" -r rj@host.com rj@host.com
exit(1)
我在下面输入的内容是错误的,我也没有收到任何电子邮件。我的语法和方法有什么问题吗?
syntax error at line 152: `exit' unexpected
注意: -
如果成功执行Hive查询,则零成功。
放置空格后的另一个更新: - 在进行如下更改后
#!/bin/bash
hive -e " blaah blaah;"
RET_VAL=$?
echo $RET_VAL
if [ $RET_VAL -ne 0 ]; then
echo "HiveQL failed due to certain reason for LIP" | mailx -s "LIP Query Failed" -r rj@host.com rj@host.com
fi
exit
hive -e 'Another SQL Query;'
我有类似下面的内容 -
RET_VAL=0
+ echo 0
0
+ [ 0 -ne 0 ]
+ exit
状态代码为zero
,因为我的第一个查询成功但我的程序在此之后退出并且它没有执行我的第二个查询?为什么?我在这里肯定会遗漏一些东西。
答案 0 :(得分:2)
您也可以找到有用的设置立即退出选项:
set -e Exit immediately if a simple command (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a && or || list, or if the command's return value is being inverted via !. A trap on ERR, if set, is executed before the shell exits.
如本例所示
#!/bin/bash
set -e
false
echo "Never reached"
答案 1 :(得分:1)
除非我误解了这种情况,否则很简单:
#!/bin/bash
DATE_YEST_FORMAT1=`perl -e 'use POSIX qw(strftime); print strftime "%Y-%m-%d",localtime(time()- 3600*504);'`
echo $DATE_YEST_FORMAT1
QUERY0="
SELECT t1 [0] AS buyer_id
,t1 [1] AS item_id
,created_time
FROM (
SELECT split(ckey, '\\\\|') AS t1
,created_time
FROM (
SELECT CONCAT (
buyer_id
,'|'
,item_id
) AS ckey
,created_time
FROM dw_checkout_trans
WHERE to_date(from_unixtime(cast(UNIX_TIMESTAMP(created_time) AS BIGINT))) = '$DATE_YEST_FORMAT1' distribute BY ckey sort BY ckey
,created_time DESC
) a
WHERE rank(ckey) < 1
) X
ORDER BY buyer_id
,created_time DESC;"
if hive -e "$QUERY0"
then
sleep 120
QUERY1=`hive -e "
set mapred.job.queue.name=hdmi-technology;
SELECT SUM(total_items_purchased), SUM(total_items_missingormismatch) from lip_data_quality where dt='$DATE_YEST_FORMAT2';"`
# ...and whatever you do with $QUERY1...
fi
字符串$QUERY0
是为了方便,而不是必需品。关键是您可以使用if
语句测试命令是否成功(返回状态0)。 test
命令(更好地称为[
)只是一个在满足测试条件时返回0的命令,在不满足时返回1(非零)。
因此,if
语句运行第一个hive
查询;如果它通过(退出状态0),那么(并且只有那时)它会转到then
子句中的动作。
我抵制了重新格式化SQL的诱惑;足以说明,这不是我在自己的代码中使用的布局。