Hive操作
-
Hive作为Hadoop生态的数据仓库工具,支持类似SQL的结构化查询语句,与标准SQL不同的是,HiveSQL支持更多的函数,用于海量数据的处理
-
数据库与数据仓库
对比 | 数据库 | 数据仓库 | 数据湖 |
---|---|---|---|
数据量 | MB、GB | GB PB TB | GB TB PB |
数据种类 | 结构化数据 关系型数据、K-V数据 | 关系型结构化数据 | 结构化、半结构化、非结构化 |
实现方式 | MySQL Oracle | Hive SparkSQL | OSS |
使用场景 | 与应用程序进行低延迟交互 | 存放历史存量为数据分析做容器 |
特殊操作
-
Hive命令行中允许执行shell命令
# ! shell命令; hive> ! clear;
-
Hive命令行中允许执行hdfs命令
# dfs 命令; hive> dfs -ls /;
查看和修改Hive终端配置
# 查看所有配置 hive> set # 查看某个配置的值 # hive> set 配置项名称; hive (db_test01)> set hive.cli.print.current.db; # 修改当前终端配置 hive> set hive.cli.print.current.db=true;
注意:上述修改方式只当前终端有效,如果要永久生效,需要
在hive-site.xml添加配置
<property> <name>hive.cli.print.current.db</name> <value>true</value> </property>
DDL
-
库
-- 创建数据库 create database 数据库名; -- 查看数据库 show databases; -- 切换数据库 use 数据库名; -- 删除数据库 -- 只能删除空数据库 drop database 数据库名; -- 删除有文件的数据库,递归强制删除 drop database 数据库名 cascade;
-
表
-- 查看表 show tables; -- 创建表 -- 创建 外部 表 如果不存在 表名 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name -- (列名 数据类型 字段备注,) [(col_name data_type [COMMENT col_comment], ...)] -- 表备注 [COMMENT table_comment] -- 设置表的分区字段 (字段名 类型) [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] -- 指定分桶 按照 (字段名) [CLUSTERED BY (col_name, col_name, ...) -- 在分桶过程中 按照某些字段排序 [SORTED BY (col_name [ASC|DESC], ...)] -- 设置桶的个数 INTO num_buckets BUCKETS] -- 行 格式 [ROW FORMAT -- 受限于 DELIMITED -- 字段 结束 于 字符 [FIELDS TERMINATED BY ' |- \u0001'] -- 集合 元素 结束 于 [COLLECTION ITEMS TERMINATED BY ','] -- 映射结构的kv之间的分隔符 [MAP KEYS TERMINATED BY ':'] -- 设置行结束符 [LINES TERMINATED BY '\n']] -- 设置文件的存格式 -- text -- ORC 是一种列式存储的数据格式,用于海量数据的存储和查询 [STORED AS file_format] -- 设置当前表读取的HDFS路径 [LOCATION hdfs_path] -- 查看表详情 desc table_name; desc extended table_name; desc formatted table_name; -- 删除表 drop table table_name;
-
截断表
-- 保留表的结构 移除所有的表内容 -- 只有管理表才能进行截断操作 truncate
DML
-
Hive底层将表的内容保存在HDFS,HDFS不支持文件的随机修改
-
所以Hive也不支持表的字段修改和数据的update操作
数据导入
-
load data
-- 加载数据 本地 从某个路径 可以是本地路径或者hdfs路径 load data [local] inpath '/root/data/student.txt' -- 是否覆盖 加载到 某个表 [overwrite] into table student -- 添加分区字段 [partition (partcol1=val1,…)];
-
insert
-- 将后面的查询结果 写入到前表中 insert into table 表名 partition (分区字段) select语句;
-
as select
-- 通过查询结果创建新表 create table if not exists 表名 as select语句;
-
hdfs直接上传文件
-- 本质上Hive就是将表结构映射到HDFS文件,所以直接操作底层文件夹可以让Hive读取上传的文件, -- 分区表 需要检查并修复分区 msck repair table 表名 -- 检查表的行格式与原始数据是否一致,如果不规整的数据通常创建单列的表作为原始表 hdfs dfs -put 文件 表路径
数据导出
-
insert
将数据库中的表数据导出 到hdfs或者本地linux
-- 不加local则导出到HDFS路径 insert overwrite local directory '/output_t_weblog' row format delimited fields terminated by '|' select * from t_weblog_extracted_orc;
-
hdfs get 如果Hive表使用text存储格式,则可以直接从表所在路径读取表的内容文件
-
hive自带的导入导出工具
-- 将表数据导出到hdfs路径 export table default.student to '/user/hive/warehouse/export/student'; import table student2 partition(month='202005') from '/user/hive/warehouse/export/student';
Sqoop
DQL
-- 去重 HQL中通常需要使用各种函数对查询的字段进行处理 SELECT [ALL | DISTINCT] select_expr, select_expr, ... -- 从哪个表查 FROM db_ref.table_ref t1, (select xxx) t2 -- 添加过滤条件 [WHERE where_condition] -- 分组 MR底层指定分区条件 [GROUP BY col_list] -- 排序 (全局排序) MR要实现全局排序 就只能启动1个reducer [ORDER BY col_list] -- 如果MR分区和排序的字段 是同一个字段,则可以直接使用 CLUSTER by [CLUSTER BY col_list -- 指定按某些字段进行分布 (MR分区,自定义partitioner) | [DISTRIBUTE BY col_list] -- 指定分区内的排序方式 (MR 中的shuffle排序) [SORT BY col_list] ] -- 限制读取原始数据的条数 [LIMIT number]COPY