2

yyyyMMdd 形式の日付で分割されたテーブルがあります。次のような単純なクエリを実行すると:

SELECT COUNT(*) FROM MyTable WHERE Date >= '20140924'

次に、3 日分のデータをスキャンします (今日は 26 日です)。ただし、クエリで常に過去 3 日間を参照するようにしたいので、次のように記述します。

SELECT COUNT(*) FROM MyTable
WHERE date >= from_unixtime(unix_timestamp() - 259200, 'yyyyMMdd')

問題は、すべてのパーティションをスキャンするようになったことです。大なりの後のクエリの部分を事前に計算する方法はありますか?

4

2 に答える 2

1

残念ながら、Hive はそれをサポートしていません。私は過去に同様の問題に直面しており、ハイブテーブルには過去 2 年間パーティションがありました。

ただし、できる回避策の 1 つは、シェル スクリプト内でこのハイブ クエリを実行し、この日付を別の変数で計算して、それをハイブ クエリの変数として使用することです。スクリプトの例は次のとおりです。

#!/bin/bash

date=`date +"%Y%m%d" -d "-3 days"`
hive -e "select count(*) from MyTable where date >= '$date'"
于 2014-09-26T09:21:55.167 に答える
0

1 つの回避策は、計算された時間を選択できる 1 行のテーブルを作成することです。

CREATE TABLE dual (dummy STRING);
INSERT INTO TABLE dual SELECT count(*) FROM dual;

SELECT COUNT(*) FROM MyTable t1
JOIN (
    SELECT from_unixtime(unix_timestamp() - 259200, 'yyyyMMdd') myDate
    FROM dual LIMIT 1
) t2 ON (t2.myDate = t1.Date)
于 2014-09-26T14:48:25.853 に答える