Hive数仓操作(十二)

news/2024/10/4 10:46:13 标签: hive, hadoop, 数据仓库, 大数据, 数据库

一、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:

SELECT
    user_id,
    collect_list(order_id) as order_ids
FROM
    orders
GROUP BY
    user_id;
示例结果
user_idorder_ids
1[101, 101, 103]
2[104, 105]

2. 行转列:collect_set()

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

示例数据文件

使用同一个 orders.txt 文件。

导入数据到 Hive 表

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

SELECT
    user_id,
    collect_set(order_id) as unique_order_ids
FROM
    orders
GROUP BY
    user_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() 函数炸裂拆分:

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_idinterest
1sports
1music
1art
2reading
2travel

二、Hive 收集切割

1. split()

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

示例数据文件

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

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

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

SELECT
    user_id,
    split(interests, ',') as interest_array
FROM
    user_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() 将这个字符串拆分成数组:

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

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

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


http://www.niftyadmin.cn/n/5689836.html

相关文章

【C++】模拟实现红黑树

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 📌实现RBTreeNode类模板 🎏构造RBTreeNode类成员变量 🎏实现RBTreeNode类构…

Redis: 集群架构,优缺点和数据分区方式和算法

集群 集群指的就是一组计算机作为一个整体向用户提供一组网络资源 我就举一个简单的例子,比如百度,在北京和你在上海访问的百度是同一个服务器吗?答案肯定是不是的,每一个应用可以部署在不同的地方,但是我们提供的服务…

开启AI新篇章:探索GPT-4与大模型!订阅方案!简单支付!

开启AI新篇章:探索GPT-4的无限可能 随着人工智能技术的飞速发展,我们正处于一个前所未有的变革时代。作为人工智能领域的领导者,OpenAI 推出的GPT-4,以其卓越的自然语言处理能力和强大的计算潜力,引发了行业内外的广泛…

[uni-app]小兔鲜-06地址+sku+购物车

收址模块 准备 地址管理分包页面 和 添加地址分包页面 新增和修改地址 import type { AddressParams, AddressItem } from /types/address import { http } from /utils/http/*** 添加收货地址* param data 请求参数*/ export const postMemberAddressAPI (data: AddressPara…

WooCommerce与wordpress是什么关系

WooCommerce与WordPress之间的关系非常紧密,因为WooCommerce实际上是一个为WordPress设计的插件。WordPress是一个内容管理系统(CMS),广泛用于创建各种类型的网站,包括博客、企业网站等。而WooCommerce则是一个免费且开源的电子商务插件&…

访问docker容器中服务的接口,报错提示net::ERR_CONNECTION_REFUSED

背景 使用httpclient和前端调用docker容器中部署的springboot服务接口,一直连接不上。 报错信息 AxiosError {message: Network Error, name: AxiosError, code: ERR_NETWORK, config: {…}, request: XMLHttpRequest, …} sys.ts:28 POST http://172.33.28.179:8181/sy…

婚庆公司展示网站品牌获客

婚姻几乎是人生必走的一步,各城市婚庆品牌不少,也有多地连锁门店,一场婚庆随规格不同往往价格并不算低,因此客户在实际选择方面,线上线下都会寻找合适的商家、咨询、查看资料、好友推荐等。 除了线下实际到店咨询外&a…

C Primer Plus 第7章习题

你该逆袭了 红色标注的是:错误的答案 蓝色标注的是:正确的答案 绿色标注的是:做题时有疑问的地方 橙色标注的是:答案中需要着重注意的地方 练习题 一、复习题1、2、我的答案:第4问 错误正确答案:第4问的答案…