Hive数仓操作(十二)

一、Hive 中的行列转换

1. 行转列: collect_list()

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

示例数据文件

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

复制代码
1,101
1,101
1,103
2,104
2,105
导入数据到 Hive 表

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

sql 复制代码
-- 创建表
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:

sql 复制代码
SELECT
    user_id,
    collect_list(order_id) as order_ids
FROM
    orders
GROUP BY
    user_id;
示例结果
user_id order_ids
1 101, 101, 103
2 104, 105

2. 行转列:collect_set()

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

示例数据文件

使用同一个 orders.txt 文件。

导入数据到 Hive 表

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

sql 复制代码
SELECT
    user_id,
    collect_set(order_id) as unique_order_ids
FROM
    orders
GROUP BY
    user_id;
示例结果
user_id unique_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() 函数炸裂拆分:

sql 复制代码
SELECT
    user_id,
    interest
FROM
    user_interests
LATERAL VIEW
    explode(split(interests, ',')) exploded_table AS interest;
-- 加载数据
LOAD DATA LOCAL INPATH '/path/to/user_interests.txt' INTO TABLE user_interests;
示例结果
user_id interest
1 sports
1 music
1 art
2 reading
2 travel

二、Hive 收集切割

1. split()

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

示例数据文件

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

复制代码
1,sports,music,art
2,reading,travel
导入数据到 Hive 表

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

sql 复制代码
SELECT
    user_id,
    split(interests, ',') as interest_array
FROM
    user_interests;
示例结果
user_id interest_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 并将数据导入到该表中:

sql 复制代码
-- 创建表
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() 将这个字符串拆分成数组:

sql 复制代码
SELECT
    user_id,
    split(concat_ws(',', first_name, last_name, email), ',') as info_array
FROM
    user_info;
示例结果
user_id info_array
1 "John", "Doe", "john.doe@example.com"
2 "Jane", "Smith", "jane.smith@example.com"

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

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

相关推荐
Data_Journal5 小时前
如何将网页抓取用于机器学习
大数据·开发语言·数据库·python·scrapy
雪兽软件5 小时前
大数据小白指南
大数据
Lyra_Infra5 小时前
从 MySQL 到达梦:一次信创隔离环境里的数据库迁移踩坑实录
数据库·后端·mysql
数据工匠老o5 小时前
sysbench/TPC-C/自定义脚本:数据库压测工具对比与实战流程
数据库·测试
程序员天天困5 小时前
Kafka 接入 AI 的三条路线:MCP 提案、会话记忆与实时上下文
大数据·后端·kafka
数据智研5 小时前
【数据分享】300个城市-5G试点城市DID数据(2014-2025)
大数据·运维·人工智能·信息可视化·数据分析
一只鹿鹿鹿5 小时前
面向智能制造的 RPA 业务自动化整体解决方案(PPT)
大数据·安全·架构·系统安全·制造
数安3000天6 小时前
数据分类分级产品有哪四类技术路线?
大数据·数据库
泡茶喝茶写代码6 小时前
量化数据开发实战系列(第 25 篇):基金基础接口实战:基金列表、ETF-LOF 分类、基金概况、净值数据
java·数据库·人工智能·python·mysql
张小姐的猫6 小时前
【AI大模型接入SDK】 —— 数据管理 & 与Session模块进行联动
数据结构·数据库·c++·人工智能·python·chatgpt