1. impala 使用concat_ws
将多列合并为一列
首先查看一下表的信息
select uid, category, tags from dmr.edu_course_profile;
select
uid,
trim(concat_ws(' ',isnull(c.category,''),isnull(c.tags,''))) as course_tags
from dmr.edu_course_profile c;
其中
trim( )
函数是将合并后的course_tags字段两边的空格清除
concat_ws( )
函数的第一个参数指定字段连接符,这里我使用的是空格,第二个参数是要合并的列名
isnull()
函数的第一个参数是字段名,第二个参数是当字段为空时的替换字符,这里我设置的是空
效果如下图:
2. impala 使用group_concat
将多行合并为一行
首先照旧来看下表的信息
select uid, group_concat(name,' ') as tags
from c
group by uid
其中
group_concat( )
第一个参数是要合并的字段名,第二个参数是指定行间的连接符。
3. 使用 ROW_NUMBER() OVER
来进行业务去重
去重原因:例如,业务方不知道之前已经添加过了该课程,然后再次添加,导致同一课程或者课组的信息被添加了多次
去重逻辑:
- 以主键来进行分区和区内排序:
SELECT *,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY id DESC)
FROM table_name
- 只取每个分区的第一个,完成去重
INSERT OVERWRITE TABLE test_table
SELECT * FROM(SELECT *,
ROW_NUMBER() OVER(PARTITION BY id1,id2 ORDER BY id1,id2 DESC) RN
FROM test_table)T
WHERE T.RN = 1 AND id1 is not null and id2 is not null
或者使用 ROW_NUMBER() OVER
来进行组间排序
照旧看下表信息:
SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee
效果如下图: