1

以下は、正常に動作しているいくつかのハイブ 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 Query が正常に実行された場合、0 は成功です。

スペースを入れた後の別の更新:- 以下のような変更を加えた後

#!/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、最初のクエリは成功しましたが、その後プログラムが終了し、2 番目のクエリを実行できませんでした。なんで?ここでも確かに何かが欠けています。

4

2 に答える 2

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"
于 2012-08-16T04:27:11.033 に答える
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クエリを実行します。then合格した場合(終了ステータス0)、(そしてその場合にのみ)句のアクションに進みます。

私はあなたのSQLを再フォーマットしたいという誘惑に抵抗しました。言うまでもなく、それは私が自分のコードで使用するレイアウトではありません。

于 2012-08-16T03:46:19.353 に答える