您好我有下表:
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
对于糟糕的表格格式感到抱歉,我希望它仍然清楚我的意思。 我会提供任何帮助
答案 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_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;
注意:您需要对上述语句进行微小的修改(例如路径,类型)。