【SQL相关】Hive行列字符串的合并与拆分

这篇具有很好参考价值的文章主要介绍了【SQL相关】Hive行列字符串的合并与拆分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、行方向

1. 行方向的合并

1.1 concat 函数

1.2 concat_ws 函数

2. 行方向的拆分

二、列方向

1. 列方向的合并

1.1 group_concat 函数

1.2 collect_list 函数

1.3 collect_set 函数

2. 列方向的拆分

2.1 explode 函数

2.2 lateral view文章来源地址https://www.toymoban.com/news/detail-850955.html


一、行方向

1. 行方向的合并
  • 将同一行某几列的数据以分隔符分隔,合并到同一列。
  •  concatconcat_ws 函数
1.1 concat 函数
  • concat 函数用于将多个字符串连接成一个字符串。
  • 语法格式:concat(str1, str2, …)
  • 如有任何一个参数为 NULL ,则返回值为 NULL,可以考虑使用 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);
1.2 concat_ws 函数
  • concat_ws 代表 concat with separator(分隔符),是 concat 的特殊形式。
  • 语法格式:concat_ws(separator, str1, str2, …)
  • 如有任何一个参数为 NULL ,则返回值为 NULL,可以考虑使用 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);

2. 行方向的拆分
  • 将一列的数据通过分隔符拆分成几列。
  • 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

二、列方向

1. 列方向的合并
  • 将同一列某几行的数据合并到同一行。
  •  group_concatcollect_listcollect_set 函数
1.1 group_concat 函数
  • group_concat 函数用于将同一组的多行值合并成一个字符串。
  • 语法格式:group_concat(expr[, sep])
  • 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
1.2 collect_list 函数
  • collect_list 函数用于将多个值收集到一个列表中,不去重。
  • 语法格式:collect_list(expr)
  • 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
1.3 collect_set 函数
  • collect_set 函数用于将多个值收集到一个列表中,去重。
  • 语法格式:collect_set(expr)
  • 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

2. 列方向的拆分
  • 将一行的数据通过分隔符拆分成几行。
  •  explode 函数
2.1 explode 函数
  • explode 函数用于打散行,将一行的数据拆分成一列。
  • 语法格式:explode(arr/map)
  • explode 函数只接受 arraymap 类型。如果要拆分 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;
2.2 lateral view
  • explode 函数不能关联原有的表中的其他字段,无法将结果插回原表。
-- 错误示例
select other_col
      ,explode(array_col) as new_col 
from table_1;
  • explode 函数不能与 group bycluster bydistribute bysort by 联用。
  • select 后面只能获得一个 explode 函数产生的视图,如果还要获取其他列,则需要使用 lateral view 将多个视图合并。
  • lateral view 用于和 UDTF 函数(explodesplit)结合使用,主要解决在 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是虚拟表名

到了这里,关于【SQL相关】Hive行列字符串的合并与拆分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 2788.按分隔符拆分字符串:模拟(字符串处理)

    力扣题目链接:https://leetcode.cn/problems/split-strings-by-separator/ 给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组, 不包括空字符串 。 注意 separator 用于决定拆分发生的位置,但它不包含在

    2024年01月21日
    浏览(45)
  • 【Kotlin】字符串操作 ① ( 截取字符串函数 substring | 拆分字符串函数 split | 解构语法特性 )

    Kotlin 中提供了 截取字符串函数 substring , 可接收 IntRange 类型的参数 , 这是 整数范围 类型 ; 截取字符串函数 substring 函数原型为 : 整数范围类型 : 其整数范围是 {0 , 1 , 2 , 3} ; 其整数范围是 {0 , 1 , 2} ; 代码示例 : 执行结果 : 拆分字符串函数 split 返回的是 List 集合 ; 拆分字符串函

    2023年04月08日
    浏览(43)
  • Mysql(函数) 字符串截取、拆分, 逗号分割字符串当做 in 的条件

    目录  引言:  数据库函数的总结(一) 1. mysql截取拆分 2. 逗号分割的字符串 作为in条件 - 2.1 正常的效果应该是  --- 2.1.1 错误:  3. 字符串合并(多条数据合并 用\\\'、\\\'分割) 1. 字符串截取、拆分 可以用于将用户输入的字符串按照特定的规则进行截取,比如获取电话号码中的区号、

    2024年02月08日
    浏览(52)
  • Python 中将字符串拆分为整数列表

    将字符串拆分为整数列表: 使用 str.split() 方法将字符串拆分为字符串列表。 使用列表理解来迭代字符串列表。 使用 int() 类将每个字符串转换为整数。 列表推导用于对每个元素执行一些操作,或者选择满足条件的元素子集。 在每次迭代中,我们将当前列表项传递给 int() 类

    2024年02月05日
    浏览(42)
  • 力扣2788-按分隔符拆分字符串

    题目链接 解题思路: 1 .传参是一个字符串数组,我们需要对每一个字符串处理 2 .解题中e是字符串数组中的每一个字符串 3 .i是每个字符串的下标,n为每个字符串的大小 4 .遍历整个字符串 5 .start是要切割的位置

    2024年01月20日
    浏览(39)
  • leetcode-2788按分隔符拆分字符串

    题目链接 2788. 按分隔符拆分字符串 - 力扣(LeetCode) 解题思路

    2024年01月21日
    浏览(35)
  • day-15 按分隔符拆分字符串

    思路 依次对words的每个字符进行split(),然后将非空的加入List 解题方法 String arr[]=s.split(ss);利用split()方法将words的每个字符串划分为String数组 if(arr[i]!=“”) //将非空的加入 list.add(arr[i]); String ss=“”+separator; //使用转义字符 时间复杂度: O(mn) 空间复杂度: O(n) Code

    2024年01月20日
    浏览(35)
  • LeetCode.2788. 按分隔符拆分字符串

    题目链接 题目的意思是给我们一个字符串数组和一个分隔符,让我们按照分隔符把字符串数组分割成新的字符串数组。 看到这个描述,这不就是直接就是利用 按照分隔符分割字符串的系统库函数split() ,这个函数的意思就是 把一个字符串按照你给定的分隔符分割成字符串数

    2024年01月23日
    浏览(65)
  • Leetcode 2788. 按分隔符拆分字符串

    我们可以先自己模拟一下分隔字符串的过程。如果只是简单的,遇到分隔符,将分隔符前后的子串加入结果的List,那么很显然并没有考虑到一个String中有多个字符串的情况。一种比较容易想到的方法是: 先对List中每个字符串遍历; 对于每个字符串内部,维护一个缓冲区;

    2024年01月21日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包