Hive查询:行转列和列转行使用场景说明

本文介绍了Hive中行转列和列转行的使用场景,通过具体操作过程展示了如何利用CONCAT, COLLECT_SET等函数进行数据转换。在处理复杂数据时,行转列有助于简化数据结构,而列转行则适用于拆分数组或映射结构。总结中强调了在处理非关系型数据库数据时,列转行操作的重要性。" 112037192,7978238,计算三个整数的和、积与平均值,"['算法', '数学运算', '编程任务']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 引言

对于复杂的数据,存在复杂的数据类型,面对复杂的需求,可以考虑使用行转列,或者列转行的操作

1.1 行转列说明

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

当字段存在多个数据组合或者经过变化形成类似的样子,可以考虑行转列(一个列存在了太多了信息)

突破group by 限制,将重复的列元素,转成一行显示。

1.2 列转行说明

explode(col):将Hive一列中复杂的array或者map结构拆分成多行。

lateral view 

用法:lateral view udtf(expression) tableAlias AS columnAlias

如:lateral view explode(col) table_temp as col_name

解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2. 操作过程

2.1 行转列操作

(1)数据准备

name   const   blood_type

小明    魔羯座    A
大刚    处女座    A
张三    魔羯座    B
李四    魔羯座    A
王五    处女座    A

(2)将数据保存在Hive中

hive (default)> create table person_const(
              > name string,
              > const string,
              > blood_type string)
              > row format delimited fields terminated by '\t';
OK
Time taken: 0.138 seconds
hive (default)> load data local inpath '/home/fanl/person_const.txt' into table person_const;
Loading data to table default.person_const
Table default.person_const stats: [numFiles=1, totalSize=98]
OK
Time taken: 0.275 seconds
hive (default)> select * from person_const;
OK
person_const.name	person_const.const	person_const.blood_type
小明	魔羯座	A
大刚	处女座	A
张三	魔羯座	B
李四	魔羯座	A
王五	处女座	A
Time taken: 0.063 seconds, Fetched: 5 row(s)
hive (default)> 

(3)实现需求:将星座和血型一样的名字列在一行,如:

魔羯座,A 小明|李四

首先,使用concat将星座和血型用,合并

hive (default)> select name,concat(const,',',blood_type) base from person_const;
OK
name	base
小明	魔羯座,A
大刚	处女座,A
张三	魔羯座,B
李四	魔羯座,A
王五	处女座,A
Time taken: 0.066 seconds, Fetched: 5 row(s)
hive (default)> 

接着,从以上数据中,用collect_set将重复

hive (default)> select base,concat_ws('|',collect_set(name)) as name 
> from person_const_temp group by base;
OK
base	name
处女座,A	大刚|王五
魔羯座,A	小明|李四
魔羯座,B	张三
Time taken: 19.426 seconds, Fetched: 3 row(s)

2.2 列转行

(1)数据准备

hive (default)> create table movie(
              > name string,
              > type array<string>)
              > row format delimited fields terminated by '\t'
              > collection items terminated by ',';
OK
Time taken: 0.039 seconds

《疑犯追踪》    悬疑,动作,科幻,剧情
《Lie to me》    悬疑,警匪,动作,心理,剧情
《战狼2》    战争,动作,灾难


将以上数据加载到表中

hive (default)> load data local inpath '/home/fanl/movie.txt' into table movie;
Loading data to table default.movie
Table default.movie stats: [numFiles=1, totalSize=136]
OK
Time taken: 0.15 seconds
hive (default)> 

hive (default)> select * from movie;
OK
movie.name	movie.type
《疑犯追踪》	["悬疑","动作","科幻","剧情"]
《Lie to me》	["悬疑","警匪","动作","心理","剧情"]
《战狼2》	["战争","动作","灾难"]

(2)将按type类型将数据按行显示

hive (default)> select name,typename from movie 
> lateral view explode(type) table_temp as typename;
OK
name	typename
《疑犯追踪》	悬疑
《疑犯追踪》	动作
《疑犯追踪》	科幻
《疑犯追踪》	剧情
《Lie to me》	悬疑
《Lie to me》	警匪
《Lie to me》	动作
《Lie to me》	心理
《Lie to me》	剧情
《战狼2》	战争
《战狼2》	动作
《战狼2》	灾难
Time taken: 0.044 seconds, Fetched: 12 row(s)
hive (default)> 

3. 总结

在关系数据库中,字段已经被细分了,但是大数据处理的不一定都是关系型数据库的数据,如果有存Json类型的数据,这种列转行就能大显身手了。

<think>好的,我现在需要回答用户关于Hive行转列转行的实现方法的问题。首先,我得回忆一下Hive中相关的函数操作步骤。用户可能希望得到具体的示例步骤说明,所以我要确保内容清晰,结构合理。 首先,行转列(将多行合并为一行)通常使用concat_wscollect_setcollect_list函数。concat_ws用于连接字符串,collect_set去重,collect_list保留所有元素。例如,将多个订单ID合并成一个表,可能需要按用户ID分组,然后用这些函数组合。接下来是转行(将一拆分为多行),这里主要用lateral viewexplode函数。explode可以处理数组或map类型的,将其拆分成多行。例如,拆分逗号分隔的字符串为多个sku_id,需要先用split转成数组,再用explode展开。同时,可能需要处理空值或异常情况,比如使用lateral viewouter来保留原行。然后,我需要参考用户提供的引用内容,确保引用正确。比如引用[5]提到explode函数的用法,引用[4]提到concat_ws的例子。这些引用需要自然地融入到回答中,帮助支持我的解释。用户可能还关心实际应用场景,比如数据处理中的具体案例,或者性能方面的注意事项。比如在行转列时,使用collect_set可能导致数据去重,而collect_list保留所有,这可能影响结果,需要明确说明区别。另外,需要注意语法正确性,比如HiveSQL的写法,函数参数是否正确。例如,split函数的分隔符是否正确,concat_ws的第一个参数是否是分隔符。这些细节可能会影响用户的实际操作,所以必须准确无误。 最后,生成相关问题,帮助用户深入理解。比如行转列的性能优化,如何处理复杂数据结构,或者实际应用场景有哪些。这些问题应该基于回答内容,引导用户进一步学习。 总结一下,回答的结构应该是先介绍行转列转行的概念,然后分别给出实现方法示例代码,结合引用内容,最后附上相关问题。确保每个步骤都有对应的示例解释,让用户能够逐步理解应用。</think>### Hive行转列转行实现方法 #### 一、行转列(多行合并为一行) **实现场景**:将同一分组下的多行数据合并为单行,例如用户订单聚合、标签合并等。 **核心函数**: - `collect_set()`:去重聚合 - `collect_list()`:保留重复元素 - `concat_ws()`:带分隔符的字符串连接 **示例**(用户订单聚合): ```sql SELECT user_id, concat_ws(',', collect_set(order_id)) as order_list FROM user_orders GROUP BY user_id; ``` **说明**:将每个用户的订单ID合并为逗号分隔的字符串[^4][^5]。 #### 二、转行(单拆分为多行) **实现场景**:将包含复杂结构(数组/Map)的拆分为独立行,例如SKU表展开、标签拆分。 **核心函数**: - `explode()`:炸裂数组/Map为多行 - `split()`:字符串转数组 - `lateral view`:生成虚拟表关联原数据 **示例**(拆分订单SKU): ```sql SELECT order_id, sku_id FROM orders LATERAL VIEW explode(split(sku_list, ',')) adTable AS sku_id; ``` **说明**:将逗号分隔的SKU字符串拆分为独立行[^1][^5]。 #### 三、特殊场景处理 1. **空值保留**: ```sql LATERAL VIEW OUTER explode(...) -- 使用OUTER保留原行 ``` 2. **多炸裂**: ```sql LATERAL VIEW explode(数组1) t1 AS col1 LATERAL VIEW explode(数组2) t2 AS col2 ``` #### 四、性能注意事项 - 转行操作会显著增加数据量,需关注内存压力 - 行转列的`collect_set`比`collect_list`更节省存储 - 预处理阶段使用`split`替代正则表达式可提升效率[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值