HIVE是什么?

HIVE是一个可以将sql翻译为MR程序的工具
HIVE支持用户将HDFS上的文件映射为表结构,然后用户就可以输入SQL对这些表(HDFS上的文件)进行查询分析
HIVE将用户定义的库、表结构等信息存储hive的元数据库中(可以是本地derby,也可以是远程mysql)
Hive是基于Hadoop的一个数据仓库工具(离线),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

为什么使用Hive
直接使用hadoop所面临的问题

人员学习成本太高
项目周期要求太短
MapReduce实现复杂查询逻辑开发难度太大

为什么要使用Hive

操作接口采用类SQL语法,提供快速开发的能力。
避免了去写MapReduce,减少开发人员的学习成本。 	
功能扩展很方便。

hive的特点

扩展  Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
延展性  Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
容错  良好的容错性,节点出现问题SQL仍可完成执行。

HIVE的用途?

解放大数据分析程序员,不用自己写大量的mr程序来分析数据,只需要写sql脚本即可
HIVE可用于构建大数据体系下的数据仓库

HIVE的使用方式?

方式1:可以交互式查询: 
	   bin/hive   ----->    hive>select * from t_test;
	  将hive启动为一个服务:  bin/hiveserver   ,然后可以在任意一台机器上使用beeline客户端连接hive服务,进行交互式查询
	 服务端:bin/hiveserver2
	 客户端:bin/beeline
		!connect jdbc:hive2://服务端主机名:监听的端口
		输入密码
	        !quit    退出服务		  
方式2:可以将hive作为命令一次性运行:
	   bin/hive -e "sql1;sql2;sql3;sql4"
	  事先将sql语句写入一个文件比如 q.hql ,然后用hive命令执行:  bin/hive -f q.hql
	         运行命令:hive -e "命令select * from 库名.表名;"
      		运行脚本:sh 脚本
      		如果文件过于复杂,可写在文档执行:hive -f 文件名	  
方式3:可以将方式2写入一个xxx.sh脚本中

查看数据库

show databases;

查看表

show tables;

创建表

create table 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
   row format delimited
   fileds terminated by '分隔符' 
   ;
  • 创建表结构相同的表
create table 表2 like 表1;
  新建的表2表结构定义与源表表1一致,但是没有数据
 create table 表2 as select 条件 from 表1;
 表2根据select查询的字段来建表,同时将查询的结果插入新表中
  • 创建内部表
create 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
row format delimited
fields terminated by '分隔符'
;
  • 创建外部表
create external 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
row format delimited
fields terminated by '分隔符'
location '位置'
;
  • 区别
    内部表的目录由hive创建在默认的仓库目录下
    外部表的目录由用户建表时自己指定
    drop一个内部表时,表的元信息和表数据目录都会被删除;
    drop一个外部表时,只删除表的元信息,表的数据目录不会删除;
  • 意义 通常,一个数据仓库系统,数据总有一个源头,而源头一般是别的应用系统产的, 其目录无定法,为了方便映射,就可以在hive中用外部表进行映射;并且,就算在hive中把
    这个表给drop掉,也不会删除数据目录,也就不会影响到别的应用系统;
  • 分区表
    单个字段分区
create 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...) 
partitioned by (字段名 字段类型) 
row format delimited
fields terminated by '分隔符'
;
  partitioned by 按...分区,且分区字段不能是表字段中已存在的

多个字段分区

create 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...) 
partitioned by (字段名 字段类型,字段名 字段类型...) 
row format delimited
fields terminated by '分隔符'
;

导入数据
方式1:导入数据的一种方式:
手动用hdfs命令,将文件放入表目录;
方式2:在hive的交互式shell中用hive命令来导入本地数据到表目录

  • 从本地导入数据到不同的分区目录:
    load data local inpath ‘要导入的数据1’ into table表名 partition(字段名 字段类型1);
    load data local inpath ‘要导入的数据2’ into table 表名 partition(字段名 字段类型2);
  • 将数据从hdfs导入表
    load data inpath ‘要导入的数据路径’ into 表名 partition(字段名 字段类型2)
    方式3:用hive命令导入hdfs中的数据文件到表目录
    hive>load data inpath
    ‘/access.log.2017-08-06.log’ into table t_access partition(dt=‘20170806’);
    注意:导本地文件和导HDFS文件的区别:
    本地文件导入表:复制
    hdfs文件导入表:移动

导出数据
1、将hive表中的数据导入HDFS的文件
insert overwrite directory ‘/root/access-data’
row format delimited
fields terminated by ‘,’
select * from t_access;
2、将hive表中的数据导入本地磁盘文件
insert overwrite local directory ‘/root/access-data’
row format delimited
fields terminated by ‘,’
select * from t_access limit 100000;

查询

select * from 表名;

插入表

insert into 表2 select * from 表1;

将表1查询结果插入到表2

删除表

drop table 表名;