Hive是什么
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
用写sql的形式来写mapreduce
本质是:将HQL转化成MapReduce程序
1)Hive处理的数据存储在HDFS
2)Hive分析数据底层的实现是MapReduce
3)执行程序运行在Yarn上
Hive的缺点
Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
Hive的HQL表达能力有限,数据挖掘方面不擅长
Hive的效率比较低
元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;推荐使用MySQL存储Metastore
HIve实际操作
退出 quit;
删除已创建的student表 drop table student;
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; 分隔符换行
文件加载到数据表 load data local inpath '/opt/module/datas/student.txt' into table student;
Mysql
mysql -u root -p 输入密码
退出MySQL quit;
有了MySQL 可以启动多个hive
HiveJDBC
启动hiveservicer2先退出hive quit; bin/hiveserver2
在启动hiveservicer2.启动后没有显示,换一个窗口启动beeline bin/beeline
退出!quit
连接hiveserver2
!connect jdbc:hive2://zy100:10000(回车)
beeline可以更好的结构化显示数据表
“-e”不进入hive的交互窗口执行sql语句 eg:bin/hive -e "select idfrom student;"
-f”执行脚本中sql语句 eg:bin/hive -f /opt/module/datas/hivef.sql
在hive cli命令窗口中如何查看hdfs文件系统
hive(default)>dfs -ls /;
在hive cli命令窗口中如何查看本地文件系统
hive(default)>! ls/opt/module/datas;
! ls -l /opt/module/datas;
Hive数据类型
类型转化
隐式类型转换规则如下
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型。
数据库DDL
创建数据库
创建一个数据库,数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db
避免要创建的数据库已经存在错误,增加if not exists判断。
创建一个数据库,指定数据库在HDFS上存放的位置
create database db_hive2 location '/db_hive2.db';
显示数据库信息
desc database db_hive;
删除数据库
删除空数据库 drop database db_hive2;
数据库不为空,可以采用cascade命令,强制删 drop database db_hive cascade;
创建表
REATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)] [ROW FORMAT row_format]
管理表(内部表)
当我们删除一个管理表时,Hive也会删除这个表中数据
外部表
删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
外部表删除后,hdfs中的数据还在,但是metadata中stu_external的元数据已被删除
管理表与外部表的可以互相转换
分区表
Hive中的分区就是分目录
分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
创建分区表
create table dept_partition(
deptno int, dname string, locstring
)
partitioned by (month string)
row format delimited fieldsterminated by '\t';
加载数据到分区
load data local inpath'/opt/module/datas/dept.txt' into table default.dept_partitionpartition(month='201707’);
查询分区表中数据
select * from dept_partitionwhere month='201709';
可以增加删除分区
可以创建二级分区表
可以正常加载数据
load data local inpath'/opt/module/datas/dept.txt' into table
db_hive.dept_partition2partition(month='201709', day='13');
把数据直接上传到分区目录上,让分区表和数据产生关联
dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201709/day=10;
load data local inpath'/opt/module/datas/dept.txt' into table dept_partition2partition(month='201709',day='10');
增加/修改/替换列信息
DML数据操作
语法
hive> load data [local]inpath '/opt/module/datas/student.txt' [overwrite] into table student[partition (partcol1=val1,…)];
(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表 HDFS中代入数据直接剪切源文件
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加 ;有分区insert overwrite会只重写当前分区数据。
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区
数据导出
Insert导出
查询结果导出
insert overwrite local directory '/opt/module/datas/export/student'
select * fromstudent;
格式化导出
insert overwrite local directory '/opt/module/datas/export/student1'
ROW FORMATDELIMITED FIELDS TERMINATED BY '\t' select * from student;
导出到HDFS:去掉local
Hadoop命令导出到本地
dfs -get /user/hive/warehouse/student/month=201709/000000_0
/opt/module/datas/export/student3.txt;
Export导出到HDFS上
export table default.student to
'/user/hive/warehouse/export/student';
Import数据到指定Hive表中
import table student2 partition(month='201709') from
'/user/hive/warehouse/export/student';
根据目录里的内容包含数据与元数据
清除表中数据(Truncate)
注意:Truncate只能删除管理表,不能删除外部表中数据
hive (default)> truncate table student;
网友评论