Hive数仓操作(十二)

ops/2024/10/18 21:22:43/

一、Hive 中的行列转换

1. 行转列: collect_list()

collect_list() 函数用于将一个列中的数据收集成一个数组。

示例数据文件

假设有一个名为 orders.txt 的文件,内容如下:

1,101
1,101
1,103
2,104
2,105
导入数据到 Hive 表

首先,我们创建一个表 orders 并将数据导入到该表中:

-- 创建表
CREATE TABLE orders (user_id INT,order_id INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';-- 加载数据
LOAD DATA LOCAL INPATH '/path/to/orders.txt' INTO TABLE orders;

然后,我们可以使用 collect_list() 函数收集每个用户的订单 ID:

SELECTuser_id,collect_list(order_id) as order_ids
FROMorders
GROUP BYuser_id;
示例结果
user_idorder_ids
1[101, 101, 103]
2[104, 105]

2. 行转列:collect_set()

collect_set() 函数类似于 collect_list(),但它会移除数组中的重复值。

示例数据文件

使用同一个 orders.txt 文件。

导入数据到 Hive 表

数据已经导入过,因此我们直接使用 collect_set() 函数:

SELECTuser_id,collect_set(order_id) as unique_order_ids
FROMorders
GROUP BYuser_id;
示例结果
user_idunique_order_ids
1[101, 103]
2[104, 105]

3. 列转行:explode()

explode() 函数用于将数组里的元素拆分开来,并用行展示。通常与 lateral view 函数搭配使用。

示例数据文件

假设有一个名为 user_interests.txt 的文件,内容如下:

1,sports,music,art
2,reading,travel
导入数据到 Hive 表

使用 explode() 函数炸裂拆分:

SELECTuser_id,interest
FROMuser_interests
LATERAL VIEWexplode(split(interests, ',')) exploded_table AS interest;
-- 加载数据
LOAD DATA LOCAL INPATH '/path/to/user_interests.txt' INTO TABLE user_interests;
示例结果
user_idinterest
1sports
1music
1art
2reading
2travel

二、Hive 收集切割

1. split()

split() 函数用于将一个字符串按照指定的分隔符切割成一个数组。

示例数据文件

user_interests.txt 的文件,内容如下:

1,sports,music,art
2,reading,travel
导入数据到 Hive 表

user_interests 已创建,然后,使用 split() 将兴趣字符串分割成数组:

SELECTuser_id,split(interests, ',') as interest_array
FROMuser_interests;
示例结果
user_idinterest_array
1[“sports”, “music”, “art”]
2[“reading”, “travel”]

2. split()常和concat_ws() 一起使用

concat_ws() 是一个字符串函数,用于将多列的值合并成一个字符串,使用指定的分隔符。split() 函数则用于将字符串按照指定的分隔符切割成一个数组。

示例数据文件

假设有一个名为 user_info.txt 的文件,内容如下:

1,John,Doe,john.doe@example.com
2,Jane,Smith,jane.smith@example.com
导入数据到 Hive 表

首先,我们创建一个表 user_info 并将数据导入到该表中:

-- 创建表
CREATE TABLE user_info (user_id INT,first_name STRING,last_name STRING,email STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';-- 加载数据
LOAD DATA LOCAL INPATH '/path/to/user_info.txt' INTO TABLE user_info;

然后,使用 concat_ws() 将多列的值合并成一个字符串,并使用 split() 将这个字符串拆分成数组:

SELECTuser_id,split(concat_ws(',', first_name, last_name, email), ',') as info_array
FROMuser_info;
示例结果
user_idinfo_array
1[“John”, “Doe”, “john.doe@example.com”]
2[“Jane”, “Smith”, “jane.smith@example.com”]

更多细节可参考我的sql题专栏中的炸裂函数与恢复

经典sql题(十三)炸裂对应学生的姓名和成绩
经典sql题(十四)炸裂函数的恢复


http://www.ppmy.cn/ops/122435.html

相关文章

Gitのrebase用法

在 Git 中,rebase 是一种用于整合多个提交历史的操作,它可以将一个分支的变更“重放”到另一个分支上。与 merge 不同,rebase 会产生一个线性的提交历史,使得项目的历史记录更加整洁和易于理解。 1. 什么是 Rebase? …

需求管理工具Jama Connect:与Jira/Slack/GitHub无缝集成,一站式解决复杂产品开发中的协作难题

在产品和软件开发的动态世界中,有效协作是成功的关键。然而,团队往往面临着阻碍进步和创新的重大挑战。了解这些挑战并找到强有力的解决方案,对于实现无缝、高效的团队协作至关重要。Jama Connect就是这样一种解决方案,它是一个功…

并查集的模拟实现

简化版本 class UnionFindSet { public:UnionFindSet(size_t n):_ufs(n, -1){}void Union(int x1, int x2){int root1 FindRoot(x1);int root2 FindRoot(x2);// 如果本身就在一个集合就没必要合并了if (root1 root2)return;// 控制数据量小的往大的集合合并if (abs(_ufs[roo…

【黑马点评】使用RabbitMQ实现消息队列——3.使用Jmeter压力测试,导入批量token,测试异步秒杀下单

3 批量获取用户token,使用jmeter压力测试 3 批量获取用户token,使用jmeter压力测试3.1 需求3.2 实现3.2.1 环境配置3.2.2 修改登录接口UserController和实现类3.2.3 测试类 3.3 使用jmeter进行测试3.4 测试结果3.5 将用户登录逻辑修改回去 3 批量获取用户…

CSS | 响应式布局之媒体查询(media-query)详解

media type(媒体类型)是CSS 2中的一个非常有用的属性,通过media type我们可以对不同的设备指定特定的样式,从而实现更丰富的界面。media query(媒体查询)是对media type的一种增强,是CSS 3的重要内容之一。随着移动互联网的发展,m…

Thinkphp/Laravel基于Vue的重庆旅游网站交互设计与实现

目录 系统介绍具体实现截图技术栈和环境说明开发技术简介解决的思路性能/安全/负载方面数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示获取源码方式 系统介绍 本系统的设计与实现共包含12个表:分别是关于我们信息表,配置文件信息表&#xf…

kafka和zookeeper单机部署

安装kafka需要jdk和zookeeper环境,因此先部署单机zk的测试环境。 zookeeper离线安装 下载地址: zookeeper下载地址:Index of /dist/zookeeper 这里下载安装 zookeeper-3.4.6.tar.gz 版本,测试环境单机部署 上传服务器后解压缩 …

基于微信小程序医院应急设备管理系统(源码+定制+解答)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…