Hadoop 课程笔记:Hive 介绍
Hive 构建于 HDFS 和 MapReduce 之上,用于管理和查询分析结构化或非结构化数据。
- 用 HQL 作为查询接口
- 用 HDFS 作为底层存储
- 用 MapReduce 作为执行层
在 Hive 中,每个表就是 HDFS 中的目录,若对表进行分区,则产生子文件夹。
数据存储
-
元数据保存在 RDBMS 中,如 MySQL,Derby。
元数据包含表名、表列、表的分区、表的属性(是否为外部表,表所在的目录)。
-
表中的数据存储于集群中的某个目录下。
- 内部表存储于
/usr/hive/warehouse/table_name
中,外部表存储于用户指定的目录中;内部表在删除时,将同时删除表对应的目录,外部表在删除时仅删除元数据,不删除外部目录; - 表中的数据即为这个表对应的目录下的文件,上传文件至此目录中即为在表中添加数据;
- 表的分区对应于目录下的子目录。如
table1
中包含date
和city
两个分区,则相同date
,不同city
的 HDFS 目录为:table1/date=20220608/city=GuangZhou
和table1/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 | FROM source_table_name |
SELECT
1 | SELECT [ALL | DISTINCT] select_expr,select_expr,... |