0

統計をMySQLからAmazonDynamoDBおよびElasticMapReduceに切り替えています。

MySQLで動作する次のクエリがあり、ハイブに同じテーブルがあり、MySQLと同じ結果が必要です(last_week、last_month、last_yearの製品ビュー)。

SELECT product_id,
SELECT COUNT(product_id) from dev_product_views_hive as P2 where P2.product_id=P.product_id and created >= DATE_SUB(NOW(), INTERVAL 1 WEEK) as weekly,
SELECT count(product_id) from dev_product_views_hive as P3 where P3.product_id=P.product_id and created >= DATE_SUB(NOW(), INTERVAL 1 MONTH) as monthly,
SELECT count(product_id) from dev_product_views_hive as P4 where P4.product_id=P.product_id and created >= DATE_SUB(NOW(), INTERVAL 1 YEAR) as yearly
from dev_product_views_hive as P group by product_id;

たとえば、先月ハイブを使用して結果を取得する方法を見つけました。

SELECT product_id, COUNT(product_id) as views from dev_product_views_hive WHERE created >= UNIX_TIMESTAMP(CONCAT(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()), 31)," ","00:00:00")) GROUP BY product_id;

しかし、MySqlで得られるようなグループ化された結果が必要です。

product_id views_last_week views_last_month views_last_year
2                 564             2460         29967
4                 980             3986         54982  

ハイブでこれを行うことは可能ですか?

前もって感謝します、

アメル

4

1 に答える 1

1

あなたはとまたはでそれcase when を行うことができますsum()count()

例えば。

select product_id, 
sum(case when created >= concat(date_sub(to_date(from_unixtime(unix_timestamp())), 7)," 00:00:00") then 1 else 0 end)  as weekly,
sum(case when created >= concat(date_sub(to_date(from_unixtime(unix_timestamp())), 31)," 00:00:00") then 1 else 0 end) as monthly,
sum(case when created >= concat(date_sub(to_date(from_unixtime(unix_timestamp())), 365)," 00:00:00") then 1 else 0 end) as yearly
from dev_product_views_hive 
group by product_id;

concat(date_sub(to_date(from_unixtime(unix_timestamp())), days)," 00:00:00")現在の時刻を過ぎた日のフォーマットされた文字列を返します。

case when>=あなたが期待した日を作成したときに1を返します

また、これらの行のみをカウントするハイブ組み込み関数count()を使用して、NULL以外を返すこともできます。

count(case when created >= concat(date_sub(to_date(from_unixtime(unix_timestamp())), 7)," 00:00:00") then 1 end)  as weekly
于 2013-03-18T11:47:54.577 に答える