复杂的Hive查询

时间:2013-07-03 16:01:36

标签: hadoop hive

您好我有下表:

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

对于糟糕的表格格式感到抱歉,我希望它仍然清楚我的意思。 我会提供任何帮助

1 个答案:

答案 0 :(得分:3)

您可以提供包含所有年份和月份信息的年月表。我为你编写了一个脚本来生成这样的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_yearend_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;

注意:您需要对上述语句进行微小的修改(例如路径,类型)。