0

嗨,我有下表:

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

现在我想知道一年中某个月份出现的频率。我不能使用 group by,因为这只计算表格中出现的次数。但是当一年中的某个月份没有出现时,我也想得到一个 0。所以输出应该是这样的:

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

200102--|--      1

200103--|--      1

200104--|--      0

200105--|--      0

200106--|--      1

抱歉表格格式不好,我希望我的意思仍然很清楚。我会感谢任何帮助

4

1 回答 1

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;

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

于 2013-07-04T03:13:49.927 回答