本文档提供了关于Apache Hive的基础查询指南,涵盖了数据插入、选择和删除等操作方法,适用于初学者快速上手使用Hive进行大数据处理。
### Hive基础查询知识点详解
#### 一、Hive概述与基本操作
- **Hive简介**:Apache Hive 是一个建立在 Hadoop 上的数据仓库工具,主要用于对存储在 Hadoop 文件系统中的各种数据集进行数据整理、特殊查询和分析存储。Hive 给用户提供了类SQL的查询语言“HiveQL”,使不熟悉MapReduce的用户可以方便地利用Hive处理数据。
- **Hive基本操作**:
- **创建数据库**:`CREATE DATABASE db_name;`
- **使用数据库**:`USE db_name;`
- **查看当前使用的数据库**:`SHOW DATABASES;`
- **查看表**:`SHOW TABLES;`
#### 二、数据表的创建与管理
- **创建数据表**:在Hive中,可以通过以下命令创建数据表:
```sql
CREATE TABLE IF NOT EXISTS table_name (
column_name_1 data_type comment column_comment,
column_name_2 data_type comment column_comment,
...
) ROW FORMAT DELIMITED FIELDS TERMINATED BY delimiter
STORED AS textfile;
```
其中,`IF NOT EXISTS`表示如果表不存在则创建;`ROW FORMAT DELIMITED FIELDS TERMINATED BY delimiter`定义了字段分隔符;`STORED AS textfile`指定了存储格式为文本段落件。
- **示例**:根据给定的部分内容,创建了四个数据表:student_info、course_info、teacher_info和score_info。
```sql
-- 创建学生表
DROP TABLE IF EXISTS student_info;
CREATE TABLE IF NOT EXISTS student_info(
stu_id STRING COMMENT 学生 id,
stu_name STRING COMMENT 学生姓名,
birthday STRING COMMENT 出生日期,
sex STRING COMMENT 性别
) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;
-- 创建课程表
DROP TABLE IF EXISTS course_info;
CREATE TABLE IF NOT EXISTS course_info(
course_id STRING COMMENT 课程 id,
course_name STRING COMMENT 课程名,
tea_id STRING COMMENT 任课老师 id
) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;
-- 创建老师表
DROP TABLE IF EXISTS teacher_info;
CREATE TABLE IF NOT EXISTS teacher_info(
tea_id STRING COMMENT 老师 id,
tea_name STRING COMMENT 老师姓名
) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;
-- 创建分数表
DROP TABLE IF EXISTS score_info;
CREATE TABLE IF NOT EXISTS score_info(
stu_id STRING COMMENT 学生 id,
course_id STRING COMMENT 课程 id,
score INT COMMENT 成绩
) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;
```
#### 五、数据加载
- **数据文件准备**:在Linux环境下创建指定目录并上传数据文件。
```bash
mkdir data
vim student_info.txt
vim course_info.txt
vim teacher_info.txt
vim score_info.txt
```
- **加载数据到表中**:使用`LOAD DATA LOCAL INPATH`命令将本地文件加载到Hive表中。
```sql
LOAD DATA LOCAL INPATH optmoduledatastudent_info.txt INTO TABLE student_info;
LOAD DATA LOCAL INPATH optmoduledatacourse_info.txt INTO TABLE course_info;
LOAD DATA LOCAL INPATH optmoduledatateacher_info.txt INTO TABLE teacher_info;
LOAD DATA LOCAL INPATH optmoduledatascore_info.txt INTO TABLE score_info;
```
#### 六、基础查询案例
- **案例1:查询所有学生的姓名和成绩**:
```sql
SELECT s.stu_name, sc.score
FROM student_info s
JOIN score_info sc ON s.stu_id = sc.stu_id;
```
- **案例2:查询所有学生的姓名、课程名称和成绩**:
```sql
SELECT s.stu_name, c.course_name, sc.score
FROM student_info s
JOIN score_info sc ON s.stu_id = sc.stu_id
JOIN course_info c ON sc.course_id = c.course_id;
```
- **案例3:查询每个学生的总成绩**:
```sql
SELECT s.stu_name, SUM(sc.score) as total_score
FROM student_info s
JOIN score_info sc ON s.stu_id = sc.stu_id
GROUP BY s.stu_name;
```
- **案例4:查询成绩最高的学生及其成绩**:
```sql
SELECT s.stu_name, MAX(sc.score) as highest_score
FROM student_info s
JOIN score_info sc ON s.stu_id = sc.stu_id
GROUP BY s.stu_name;
```
#### 七、进阶技巧
- **多表关联**:在实际应用中,通常需要连接多个表来获取所需的信息。例如,在上述案例2中我们通过连接三个表(学生表、课程表和分数表)来获取学生的