Hadoop 课程笔记:Hive 介绍

Hive 构建于 HDFS 和 MapReduce 之上,用于管理和查询分析结构化或非结构化数据。

  • 用 HQL 作为查询接口
  • 用 HDFS 作为底层存储
  • 用 MapReduce 作为执行层

在 Hive 中,每个表就是 HDFS 中的目录,若对表进行分区,则产生子文件夹。

数据存储

  • 元数据保存在 RDBMS 中,如 MySQL,Derby。

    元数据包含表名、表列、表的分区、表的属性(是否为外部表,表所在的目录)。

  • 表中的数据存储于集群中的某个目录下。

    • 内部表存储于 /usr/hive/warehouse/table_name 中,外部表存储于用户指定的目录中;内部表在删除时,将同时删除表对应的目录,外部表在删除时仅删除元数据,不删除外部目录;
    • 表中的数据即为这个表对应的目录下的文件,上传文件至此目录中即为在表中添加数据;
    • 表的分区对应于目录下的子目录。如 table1 中包含 datecity 两个分区,则相同 date,不同 city 的 HDFS 目录为:table1/date=20220608/city=GuangZhoutable1/date=20220608/city=ShangHai
    • 桶(Bucket):对指定列(建表时由用户指定)的值进行哈希运算,将结果取余桶的个数即为该数据应该存放的桶,桶在 HDFS 中表示为表目录下的类似于 part-00000 的文件

Hive Shell

Hive Shell 运行在 Hadoop 之上,是 Hive 提供的命令行接口

查看 hdfs 上的文件列表:dfs -ls /user

执行 Linux 命令:!Command

执行 sql 脚本:source path/sql.sql

HQL

支持 select union all join like where 各种聚合函数,支持 JSON 解析。

全表扫描或 TOPN 不需要启动 MapReduce 操作。

建表

1
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name;

clustered by 对表和分区的某个列进行分桶操作。

sorted by 对指定字段进行排序(通过此字段可取 TopN)

row format delimited fields terminated by '\t' 指定数据行中字段间的分隔符为 \t

stored as 指定文件格式

location 指定数据文件存放的 hdfs 目录

删表

1
DROP TABLE [IF EXISTS] table_name;

修改表

增加分区(将指定桶的数据单独划分为一个分区)

1
ALTER TABLE table_name ADD PARTITION(date='2008-08-08', country='China') LOCATION `/path/to/us/part00000`;

删除分区

1
ALTER TABLE table_name DROP PARTITION(date='2008-08-08', country='China')

重命名字段

1
ALTER TABLE table_name CHANGE origin_col target_name target_type

加载数据

INSERT OVERWRITE 会覆盖指定分区的数据

从本地文件中加载

1
LOAD DATE LOCAL INPATH 'path/to/local/data' OVERWRITE INTO TABLE table_name PARTITION(date='2020-06-08');

从指定表中选取数据插入

1
2
3
4
5
FROM source_table_name 
INSERT OVERWRITE TABLE target_table_name_1
SELECT source_table_name.* WHERE source_table_name.key < 100
INSERT OVERWRITE TABLE target_table_name_2
SELECT source_table_name.key,source_table_name.value WHERE source_table_name.key > 100;

SELECT

1
2
3
4
5
6
SELECT [ALL | DISTINCT] select_expr,select_expr,...
FROM table_name
[WHERE condition]
[Group BY col_name]
[CLUSTER BY col_name | [DISTRIBUTE BY col_name] [SORT BY col_list]]
[LIMIT number]