Hive数仓操作(十二)
一、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_id | order_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_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()
函数炸裂拆分:
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()
将兴趣字符串分割成数组:
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
并将数据导入到该表中:
-- 创建表
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_id | info_array |
---|---|
1 | [“John”, “Doe”, “john.doe@example.com”] |
2 | [“Jane”, “Smith”, “jane.smith@example.com”] |
更多细节可参考我的sql题专栏中的炸裂函数与恢复
经典sql题(十三)炸裂对应学生的姓名和成绩
经典sql题(十四)炸裂函数的恢复