2013-03-04 6 views
0

Я перехожу с MySQL на Amazon DynamoDB и Elastic MapReduce.Hive несколько подзапросов и групп по

У меня есть запрос ниже, который работает с 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 

Можно сделать это с улей?

Спасибо заранее,

амер

+0

Вы пробовали? –

+0

Да, всегда получайте ошибку синтаксического анализа, я не знаю, как правильно записать эти подзапросы MySQL в hiveql. Hiveql не такой синтаксис, как MySQL. – trkich

+0

hive ql поддерживает подзапросы только в разделе –

ответ

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 будут reterun 1 при создании >= дней, что вы ожидали

Вы также можете сделать это с помощью встроенной функции ульи count() которая подсчитывает только те строки, возвращать ненулевые

count(case when created >= concat(date_sub(to_date(from_unixtime(unix_timestamp())), 7)," 00:00:00") then 1 end) as weekly