要求:源文件中一个temp中存在N个兴趣班,目标是同一兴趣班中标签相同,分班号下发文件,同一兴趣班号包含N个学生,每个学生可能对应多个兴趣班。
环境:hive SQL
数据样式:
建表语句:
create table if not EXISTS temp(
batchid varchar(10)
,userid varchar(10)
,gender varchar(1)
);
INSERT into temp VALUES('1','12','1');
INSERT into temp VALUES('1','13','1');
INSERT into temp VALUES('1','14','0');
INSERT into temp VALUES('2','12','1');
INSERT into temp VALUES('2','23','0');
INSERT into temp VALUES('2','43','1');
INSERT into temp VALUES('3','14','0');
INSERT into temp VALUES('4','15','0');
主要思路:ROW_NUMBER() OVER() 使用
CREATE TEMPORARY TABLE TEMP_RANK
AS
SELECT CLASS_ID
,ROW_NUMBER() OVER() AS CLASS_RANK --核心代码
FROM(
SELECT CLASS_ID
FROM TEMP
GROUP BY CLASS_ID
) T1
;
CREATE TEMPORARY TABLE RESULT_TABLE
AS
SELECT T1.*
,T2.CLASS_RANK
FROM TEMP T1
LEFT JOIN TEMP_RANK T2
ON T1.CLASS_ID=T2.CLASS_ID
;
--# 最终结果表,按分组下发
SELECT CLASS_ID
,STUDENT_ID
,GENDER
FROM RESULT_TABLE
WHERE CLASS_RANK='1'
;
SELECT CLASS_ID
,STUDENT_ID
,GENDER
FROM RESULT_TABLE
WHERE CLASS_RANK='2'
;
--# ...
--# WHERE CLASS_RANK='3'
--# ...
--# WHERE CLASS_RANK='N'
分析:上面这样做只能固定最多N个班级,没有办法做到统计文件中到底有多少个兴趣班,可能每次兴趣班数量不固定,只能按照固定最大值为N来走。