сложный запрос улья

Привет, у меня есть следующая таблица:

ID------ |--- time 
======================
5-------  | ----200101
3--------| ---  200102  
2--------|----  200103  
12 ------|----  200101 
16-------|----  200103  
18-------|----  200106

Теперь я хочу знать, как часто появляется определенный месяц в году. Я не могу использовать группу, потому что это только подсчитывает количество раз, которое появляется в таблице. Но я также хочу получить 0, когда определенный месяц в году не появляется. Таким образом, вывод должен быть примерно таким:

time-------|----count
=====================
200101--|--      2

200102--|--      1

200103--|--      1

200104--|--      0

200105--|--      0

200106--|--      1

Извините за плохой формат таблицы, надеюсь, все же понятно, о чем я. буду признателен за любую помощь


person user2523848    schedule 03.07.2013    source источник


Ответы (1)


Вы можете предоставить таблицу год-месяц, содержащую всю информацию о годе и месяце. Я написал для вас скрипт для создания такого CSV-файла:

#!/bin/bash

# year_month.sh

start_year=1970
end_year=2015

for year in $( seq ${start_year} ${end_year} ); do
    for month in $( seq 1 12 ); do
        echo ${year}$( echo ${month} | awk '{printf("%02d\n", $1)}');
    done;
done > year_month.csv

Сохраните его в year_month.sh и запустите. Затем вы получите файл year_month.csv, содержащий год и месяц с 1970 по 2015 год. Вы можете изменить start_year и end_year, чтобы указать диапазон лет.

Затем загрузите файл year_month.csv в HDFS. Например,

hadoop fs -mkdir /user/joe/year_month
hadoop fs -put year_month.csv /user/joe/year_month/

После этого вы можете загрузить year_month.csv в Hive. Например,

create external table if not exists 
year_month (time int) 
location '/user/joe/year_month';

Наконец, вы можете соединить новую таблицу со своей, чтобы получить окончательный результат. Например, предположим, что ваша таблица id_time:

from (select year_month.time as time, time_count.id as id 
      from year_month 
      left outer join id_time 
      on year_month.time = id_time.time) temp
select time, count(id) as count 
group by time;

Примечание: вам нужно внести небольшие изменения (например, путь, тип) в приведенный выше оператор.

person zsxwing    schedule 04.07.2013