5

常にcurrent date -1ハイブの手段を取得する方法はありますか?yesterdays dateそしてこのフォーマットで20120805-?

このようにクエリを実行してyesterday's date、今日のようにデータを取得できますAug 6th-

select * from table1 where dt = '20120805';

しかしdate_sub function、以下のテーブルがdate(dt)列でパーティション化されているため、昨日の日付を取得するためにこの方法を試してみました。

select * from table1 where dt = date_sub(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(),
'yyyyMMdd')) , 1)     limit 10;

すべてのパーティションでデータを探していますか?なんで?クエリで何か問題がありますか?

テーブル全体がスキャンされないように、サブクエリで評価を実行するにはどうすればよいですか?

4

4 に答える 4

11

次のようなものを試してください:

select * from table1 
where dt >= from_unixtime(unix_timestamp()-1*60*60*24, 'yyyyMMdd');

これは、ハイブがテーブル全体をスキャンすることを気にしない場合に機能します。from_unixtime決定論的ではないため、Hive のクエリ プランナーは最適化しません。多くの場合 (ログ ファイルなど)、決定論的パーティション キーを指定しないと、指定されたパーティション キーを持つ行だけでなくテーブル全体がスキャンされるため、非常に大きな Hadoop ジョブが開始される可能性があります。

これが重要な場合は、追加のオプションでハイブを起動できます

$ hive -hiveconf date_yesterday=20150331

そして、スクリプトまたはハイブ端末での使用

select * from table1
where dt >= ${hiveconf:date_yesterday};

変数の名前も値も重要ではありません。この場合、unix コマンドを使用して前の日付を取得するために変数を設定できます。OPの特定のケースでは

$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d")
于 2013-03-06T04:15:02.577 に答える
1

mysql では:

select DATE_FORMAT(curdate()-1,'%Y%m%d');

sqlserver で:

SELECT convert(varchar,getDate()-1,112)

次のクエリを使用します。

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()-1*24*60*60,'%Y%m%d');
于 2012-08-07T01:38:00.857 に答える
1

DATE_SUBformat の日付を想定しているようですyyyy-MM-dd。したがって、フォーマットを取得するには、さらにフォーマット操作を行う必要がある場合があります。これを試して:

select * from table1 
where dt =  FROM_UNIXTIME(
                UNIX_TIMESTAMP(
                    DATE_SUB(
                        FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')
                    , 1)
                )
            , 'yyyyMMdd')     limit 10;
于 2014-01-22T00:01:20.330 に答える
0

これを使って:

select * from table1 where dt = date_format(concat(year(date_sub(current_timestamp,1)),'-', month(date_sub(current_timestamp,1)), '-', day(date_sub(current_timestamp,1))), 'yyyyMMdd') limit 10;

これにより、パーティションの決定論的な結果 (文字列) が得られます。

私はそれが非常に冗長であることを知っています。

于 2017-01-04T08:33:20.147 に答える