本篇文章主要介绍在使用Hive进行数据查询和处理时常用的SQL函数,帮助读者掌握基础到高级的各种操作技巧。
### Hive SQL 常见函数详解
#### 一、Case When 条件转换函数
**功能简介:**
`CASE WHEN` 是 SQL 中一种常用的条件判断语句,可以在查询时实现根据不同的条件返回不同的结果,类似于编程语言中的 `if-else` 语句。
**语法示例:**
```sql
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE resultN
END AS new_column_name
```
**应用场景:**
例如,根据用户的评分等级来确定用户级别:
```sql
SELECT user_id,
CASE
WHEN rating > 4 THEN VIP
WHEN rating > 2 THEN Regular
ELSE New User
END AS user_level
FROM users;
```
#### 二、Struct 构建结构体
**功能简介:**
`STRUCT` 函数用于创建结构体类型的列。它可以将多个字段组合成一个结构体。
**语法示例:**
```sql
STRUCT(field1, field2, field3, ...)
AS struct_column_name
```
**应用场景:**
例如,将 URL、ID 和分数组合成一个结构体:
```sql
SELECT STRUCT(url, id, score) AS user_data
FROM website_logs;
```
#### 三、To_JSON 将结果转换为 JSON 格式
**功能简介:**
`TO_JSON` 函数可以将结构体类型的列转换为 JSON 格式的数据。
**语法示例:**
```sql
TO_JSON(struct_column)
```
**应用场景:**
例如,将上一步创建的结构体转换为 JSON:
```sql
SELECT TO_JSON(STRUCT(url, id, score)) AS json_data
FROM website_logs;
```
#### 四、Collect_List 和 Collect_Set 收集列表或集合
**功能简介:**
`COLLECT_LIST` 和 `COLLECT_SET` 函数都是用于收集数据的函数,但它们有所不同。`COLLECT_LIST` 会保留重复的元素,并返回一个列表;而 `COLLECT_SET` 会去除重复的元素,并返回一个集合。
**语法示例:**
```sql
COLLECT_LIST(column)
COLLECT_SET(column)
```
**应用场景:**
例如,收集每个用户访问的所有页面的列表:
```sql
SELECT user_id, COLLECT_LIST(page) AS pages_visited
FROM user_activity
GROUP BY user_id;
```
#### 五、Row_Number() 分区编号
**功能简介:**
`ROW_NUMBER()` 函数为查询结果中的每一行分配一个唯一的编号。结合 `OVER` 子句可以指定对哪些列进行分区并排序。
**语法示例:**
```sql
ROW_NUMBER() OVER (
PARTITION BY column1, column2
ORDER BY sort_column
)
```
**应用场景:**
例如,找出每个班级中成绩最高的学生:
```sql
WITH ClassScores AS (
SELECT class, student_id, score,
ROW_NUMBER() OVER (
PARTITION BY class
ORDER BY score DESC
) AS rank
FROM scores
)
SELECT class, student_id, score
FROM ClassScores
WHERE rank = 1;
```
#### 六、Concat 和 Split 字符串拼接与分割
**功能简介:**
`CONCAT` 用于字符串拼接,而 `SPLIT` 则用于将字符串按照指定的分隔符进行分割。
**语法示例:**
```sql
CONCAT(string1, string2, ...)
SPLIT(string, delimiter)
```
**应用场景:**
例如,构建新的目录路径:
```sql
SELECT CONCAT(, SPLIT(PATH, )[1], ,
SPLIT(PATH, )[2], ,
SPLIT(PATH, )[3], ,
SPLIT(PATH, )[4], ,
SPLIT(PATH, )[5]) AS dir_path
FROM file_paths;
```
#### 七、Explode 一行转多行
**功能简介:**
`EXPLODE` 函数可以将包含列表的列展开为多行。
**语法示例:**
```sql
EXPLODE(column)
```
**应用场景:**
例如,将一句话拆分成单词:
```sql
SELECT EXPLODE(SPLIT(I love data science, )) AS words
FROM dummy_table;
```
#### 八、Regexp_Replace 正则替换
**功能简介:**
`REGEXP_REPLACE` 函数允许使用正则表达式来查找并替换文本中的模式。
**语法示例:**
```sql
REGEXP_REPLACE(string, pattern, replacement)
```
**应用场景:**
例如,移除字符串中的括号:
```sql
SELECT REGEXP_REPLACE(sale_info, [{|}], ) AS clean_info
FROM sales;
```
#### 九、Get_Json_Object 获取 JSON 对象元素
**功能简介:**
`GET_JSON_OBJECT` 函数用于从 JSON 字符串中提取指定键的值。
**语法示