赞
踩
目录
concat
与 concat_ws
函数concat
函数用于将多个字符串连接成一个字符串。concat(str1, str2, …)
。nvl
函数将 NULL 替换为 '' 。- -- 简单合并
- select concat(column1, column2, column3) as merged_column from table_1;
- select concat('Hello', 'World'); -- HelloWorld
-
- -- NULL值的处理
- select concat(NULL, 'Hello', 'World'); -- null
- select concat(nvl(olumn1, ''), column2, column3);
concat_ws
代表 concat with separator(分隔符),是 concat
的特殊形式。concat_ws(separator, str1, str2, …)
。nvl
函数将 NULL 替换为 '' 。- -- 带分隔符合并
- select concat_ws(',', column1, column2, column3) as merged_column from table_1;
- select concat_ws('-', 'Hello', 'World'); -- Hello-World
-
- -- NULL值的处理
- select concat_ws('-', NULL, 'Hello', 'World'); -- null
- select concat_ws(',', nvl(olumn1, ''), column2, column3);
split
函数split
函数用于切分数据,将一串字符串切割成一个数组。split(string str, string pat)
。array
。- -- 拆分成一个数组列
- select split('wo shi xiao ming',' ') as new_column from table_1; -- ['wo','shi','xiao','ming']
-
- -- 根据数组索引拆分成多列
- select split('1_John','_')[0] as id
- ,split('1_John','_')[1] as name
- from table_1; -- 1 John
group_concat
、collect_list
和 collect_set
函数group_concat
函数用于将同一组的多行值合并成一个字符串。group_concat(expr[, sep])
。- -- 默认分隔符合并
- select name
- ,group_concat(course) as courses
- from table_1
- group by name; -- Math,English
-
- -- 指定分隔符合并
- select name
- ,group_concat(course, '_') as courses
- from table_1
- group by name; -- Math_English
collect_list
函数用于将多个值收集到一个列表中,不去重。collect_list
(expr)
。concat_ws
时必须 cast(expr as string)
。- -- 合并为一个列表
- select department
- ,collect_list(name) as name_list
- from table_1
- group by department; -- ['John','Jack']
-
- -- concat_ws 按照指定分隔符连接列表的值
- select department
- ,concat_ws(',', collect_list(name)) as name_list
- from table_1
- group by department; -- John,Jack
collect_set
函数用于将多个值收集到一个列表中,去重。collect_set(expr)
。concat_ws
时必须 cast(expr as string)
。- -- 合并为一个列表
- select department
- ,collect_set(name) as name_list -- 假设有三行数据为'John', 'Jack', 'John'
- from table_1
- group by department; -- ['John','Jack']
-
- -- concat_ws 按照指定分隔符连接列表的值
- select department
- ,concat_ws(',', collect_set(name)) as name_list
- from table_1
- group by department; -- John,Jack
explode
函数explode
函数用于打散行,将一行的数据拆分成一列。explode(arr/map)
。array
和 map
类型。如果要拆分 string
字符串类型,需要借助 split
函数把字段分割成一个数组。- -- 拆分 array 类型
- select explode(array_col) as new_col from table_1; -- 拆分成一列多行
-
- -- 拆分 map 类型(map 是 key-value 结构)
- select explode(map_col) as (may_key_col, may_value_col) from table_1; -- 拆分成两列多行
-
- -- 拆分 string 字符串类型
- select explode(split(string_col, sep)) as new_col from table_name;
explode
函数不能关联原有的表中的其他字段,无法将结果插回原表。- -- 错误示例
- select other_col
- ,explode(array_col) as new_col
- from table_1;
explode
函数不能与 group by
、cluster by
、distribute by
、sort by
联用。select
后面只能获得一个 explode
函数产生的视图,如果还要获取其他列,则需要使用 lateral view
将多个视图合并。lateral view
用于和 UDTF
函数(explode
、split
)结合使用,主要解决在 select
使用 UDTF
做查询过程中,查询只能包含单个 UDTF
,不能包含其他字段、以及多个 UDTF
的问题。UDTF
函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表,虚拟表相当于再和主表关联, 从而达到添加 UDTF
生成的字段以外字段的目的, 即主表里的字段或者主表运算后的字段。lateral view UDTF(expression) table_view as new_column;
- select source_column
- ,new_column
- from table_1
- lateral view explode(split(source_column, ',')) a as new_column; -- a是虚拟表名
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。