Hive 行转列、列转行

Hive数据转换技巧

Hive行列之间的转换

行转列

数据说明:

# 原数据格式
《疑犯追踪》    悬疑
《疑犯追踪》    动作
《疑犯追踪》    科幻
《疑犯追踪》    剧情
《战狼2》       战争
《战狼2》       动作
《战狼2》       灾难

# 转换后数据格式
《疑犯追踪》    悬疑,动作,科幻,剧情
《战狼2》       战争,动作,灾难
  • 创建表
drop table movie_info;
create table movie_info(
    movie string, 
    category string) 
row format delimited fields terminated by " "
;
  • 加载表数据
load data local inpath "/opt/data/zj/movie.txt" into table movie_info;
  • 实现方式
-- 数据格式
select movie,concat_ws(',',collect_set(category)) name from movie_info group by movie;

先将需要聚合的字段,存放到一个集合中,然后再通过 “,” 相互链接

  • 函数说明:
    collect_set: 具有去重操作
    collect_list:不去重
    concat_ws:字符串的拼接

列转行

# 原数据格式
《疑犯追踪》    悬疑,动作,科幻,剧情
《战狼2》       战争,动作,灾难

# 转换后数据格式
《疑犯追踪》    悬疑
《疑犯追踪》    动作
《疑犯追踪》    科幻
《疑犯追踪》    剧情
《战狼2》       战争
《战狼2》       动作
《战狼2》       灾难
  • 创建表
drop table movie_info;
create table movie_info(
    movie string, 
    category string) 
row format delimited fields terminated by " "
-- collection items terminated by ","  -- 指定Array、Map类型数据的分割符
;
  • 加载表数据
load data local inpath "/opt/data/zj/movie.txt" into table movie_info;
  • 实现方式
-- explode() 函数只支持:Array类型数据 与 Map类型数据,其余数据类型不支持
select
    movie,
    category_name
from 
    movie_info lateral view explode(split(regexp_extract(concat('\[\"',category,'\"\]'),'^\\["(.*)\\"]$',1),',')) table_tmp as category_name;

hive的列转行是稍微比较难理解,列转行需要使用explode函数,但是,该函数只支持Array类型数据或者map类型的数据,不支持string和int类型数据,这就需要我们将该类型强制转换。
String类型转换为Array类型:

select split(regexp_extract(concat('\[\"',category,'\"\]'),'^\\["(.*)\\"]$',1),',') from movie_info;

["悬疑","动作","科幻","剧情"]
["战争","动作","灾难"]

到此,我们的行转列、列转行已经完成统计

<think> 首先,用户的问题是基于提供的引用信息,询问Hive中用于行转列转行的函数有哪些。引用[1]、[2]和[3]都提到了Hive中的行转列转行操作,但没有具体出函数名。 回顾引用: - 引用[1]:提到了转行行转列操作,但没有指定函数。 - 引用[2]:提到了转行行转列和一转多的操作。 - 引用[3]:提到了split函数作为示例,但split不是直接用于行转列转行的函数;它用于字符串分割。 根据我的知识,在Hive中: - **行转列(Pivot)**:Hive没有内置的PIVOT函数像SQL Server那样。通常使用CASE WHEN语句来实现行转列。 - **转行(Unpivot)**:可以使用EXPLODE函数或LATERAL VIEW结合UDTF(用户定义表生成函数)来将转为行。 具体函数: - 对于**转行(Unpivot)**:常用函数包括: - `EXPLODE()`:用于数组或映射的展开。 - `POSEXPLODE()`:带位置的explode。 - 结合`LATERAL VIEW`:来处理UDTF。 - 对于**行转列(Pivot)**:Hive原生不支持PIVOT,需要使用聚合函数如SUM、MAX等结合CASE WHEN语句来模拟。 在引用[3]中,提到了split函数,但它不是直接用于行转列/转行的;它用于字符串操作。 用户的问题:"请问hive中用于行转列转行的函数有哪些",所以我需要出这些函数。 根据我的知识: - 主要函数: - 转行:`EXPLODE()`, `POSEXPLODE()`, `LATERAL VIEW` - 行转列:没有特定函数,使用`CASE WHEN`和聚合函数。 在Hive中常见的: - `EXPLODE()`:用于将数组或映射转为多行。 - 对于行转列,需要手动写查询。 系统级指令: - 所有行内数学表达式用$...$,但这里可能不涉及数学表达式。 - 独立公式用$$...$$,单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识,如[^1]。 回答结构: - 先回答问题,清晰出函数。 - 然后生成相关问题。 - 确保语言是中文。 可能的回答: - 介绍转行函数:`EXPLODE()`、`LATERAL VIEW`。 - 介绍行转列方法:使用`CASE WHEN`语句。 - 引用提供的引用,如果需要的话。用户说"上述引用仅供参考",所以我应该基于我的知识回答,但可以参考引用。 引用提到了split函数在引用[3],但它不是核心函数。我应该专注于核心函数。 生成相关问题: - 系统指令说"生成相关问题",所以在回答末尾添加相关问题。 - 类似示例:"§§相关问题§§",然后出几个问题。 最终回答结构: 1. 开头:直接回答问题。 2. 详细说明:解释每个函数或方法。 3. 添加引用标识:如果需要引用提供的引用。 4. 相关问题。 添加引用:既然用户提供了引用,我应该自然地引用它们。例如,提到引用[2]讨论了具体操作。 但现在,基于查询:"参考站内引用",但实际上引用是针对用户查询的上下文。 用户说:"上述引用仅供参考",所以我使用它们作为参考。 在回答中,可以说:如引用[2]所述,Hive SQL支持行转列转行操作。 具体函数: - 转行:`EXPLODE()` - 行转列:通过CASE WHEN 出函数: - 用于转行的函数:`EXPLODE()`, `LATERAL VIEW` - 用于行转列的函数:没有内置函数,使用SQL构造如聚合和CASE WHEN 在引用中没有指定函数名,所以我会基于标准知识。 </think> 基于您的查询和提供的引用信息,我将详细介绍 Hive 中用于行转列(Pivot)和转行(Unpivot)的核心函数及方法。Hive 作为 Hadoop 生态系统中的数据处理工具,原生支持一些函数来处理这些转换,但部分操作需要结合 SQL 语句实现(如行转列)。以下是详细的函数表和用法说明,结合了我的知识和参考引用中的内容(引用[1]中提到这些操作在数据处理中实用性高[^1],引用[2]强调了一转多的场景[^2],引用[3]则展示了字符串函数如 `split()` 的辅助作用[^3])。 ### Hive 行转列转行函数及方法 在 Hive 中,行转列(将多行数据聚合为单行)和转行(将单行数据展开为多行)是常见的数据处理需求。以下是核心函数和技巧: #### 1. **转行(Unpivot)函数** 转行用于将一或多数据展开为多行记录。主要依赖以下函数: - **`EXPLODE()` 函数**:这是最常用的函数,用于将数组(Array)或映射(Map)类型的拆分为多行。语法为 `EXPLODE(array)` 或 `EXPLODE(map)`。 - 示例:假设有一个 `industries` 存储数组 `['IT', 'Finance']`,使用 `EXPLODE(industries)` 可以将它拆分为两行:`'IT'` 和 `'Finance'`。 - 实际应用:常用于处理一多值的场景,如引用[2]中提到的“行业字段含有多个行业”的情况[^2]。 - **`LATERAL VIEW` 语法**:通常与 `EXPLODE()` 结合使用,处理用户定义表生成函数(UDTF)。它将 `EXPLODE()` 的结果作为虚拟表连接回原表。 - 语法:`SELECT ... FROM table LATERAL VIEW EXPLODE(column) alias AS new_column` - 示例:将 `sales` 表中的 `product_list` 数组展开: ```sql SELECT id, exploded_product FROM sales LATERAL VIEW EXPLODE(product_list) exploded_table AS exploded_product; ``` - 优点:支持多展开和复杂嵌套结构。 - **`POSEXPLODE()` 函数**:与 `EXPLODE()` 类似,但额外返回元素的位置索引(position)。适用于需要保留顺序的场景。 - 示例:`SELECT posexplode(industries) AS (pos, industry) FROM table` 这些函数简化了数据展开操作,如引用[1]所述,能帮助高效处理转行需求[^1]。 #### 2. **行转列(Pivot)方法** 行转列用于将多行数据聚合为单行,Hive 没有内置的 PIVOT 函数,需要使用聚合函数(如 `SUM()`, `MAX()`)结合条件语句实现: - **`CASE WHEN` 语句**:这是最常用的方法,通过条件判断将行数据转换为。 - 语法:`SELECT ..., CASE WHEN condition THEN value ELSE default END AS new_column FROM ...` - 示例:将 `sales` 表中不同年份的销售额行数据,转置为(如 `year_2020`, `year_2021`): ```sql SELECT product_id, SUM(CASE WHEN year = 2020 THEN amount ELSE 0 END) AS year_2020, SUM(CASE WHEN year = 2021 THEN amount ELSE 0 END) AS year_2021 FROM sales GROUP BY product_id; ``` - 应用场景:常用于报表生成,如引用[2]中描述的“SQL 行转列和一转多”操作[^2]。 - **辅助函数**:行转列常依赖聚合函数和字符串函数: - `COLLECT_LIST()` 或 `COLLECT_SET()`:将分组后的值收集为数组,可与 `EXPLODE()` 配合用于复杂转换。 - `split()` 函数:虽然不是直接用于行转列,但常用于预处理字符串数据(如引用[3]中的示例 `split('ab_cd_ef', '\_')`[^3]),辅助数据拆分。 #### 关键注意事项 - **性能优化**:转行操作(如 `EXPLODE()`)可能增加数据量,需注意分区和索引以提升效率;行转列操作(`CASE WHEN`)在大型数据集上可能较慢,建议结合聚合优化。 - **兼容性**:这些函数在 Hive 0.10+ 版本支持。如果数据包含嵌套结构,可以使用 `JSON_TUPLE()` 或其他解析函数预处理。 - **实际案例**:如在引用中所述,这些操作广泛应用于数据清洗、报表生成和行业细分分析[^1][^2]。 如果需要具体代码示例或更多细节,请提供您的数据 schema,我可以生成完整的 Hive SQL 查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值