一、hive概述:
  由Facebook开源用于解决海量结构化日志的数据统计,后称为Apache Hive为一个开源项目
     结构化数据:数据类型,字段,value---》hive
     非结构化数据:比如文本、图片、音频、视频---》会有非关系型数据库存储,或者转换为结构化
  结构化日志数据:服务器生成的日志数据,会以空格或者指表符分割的数据,比如:apache、nginx等等
  Hive 是一个基于 Hadoop 文件系统之上的数据仓库架构,存储用hdfs,计算用mapreduce
  Hive 可以理解为一个工具,不存在主从架构,不需要安装在每台服务器上,只需要安装几台就行了
  hive还支持类sql语言,它可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能
  hive有个默认数据库:derby,默认存储元数据---》后期转换成关系型数据库存储mysql
  hive的版本:apache-hive-1.2.1 、hive-0.13.1-cdh5.3.6
              https://github.com/apache/  主要查看版本的依赖
  下载地址:
  apache的:http://archive.apache.org/dist/hive/
  cdh的:http://archive.cloudera.com/cdh5/cdh/5/  
sql on hadoop的框架:
     hive--》披着sql外衣的map-reduce
     impala--》查询引擎,适用于交互式的实时处理场景
  presto--》分布式的sql查询引擎,适用于实时的数据分析
  spark sql
  等等。。。。

二、Hive的体系结构

    Client:

                命令行:直接打开命令行bin/hive; 或者将hive以服务的形式开启,bin/hiveserver2,然后通过bin/beeline -u                                         jdbc:hive2//hostname:10000/(database)/ -n linux用户 -p 密码

                        JDBC:

     metastore元数据:存储再数据库中,默认的是derby数据库,但是不能多用户访问,更改mysql;

                             原数据:表名,表的所属的数据库,表的拥有者,表的分区信息等等


       Driver:

                    解析器:解析HQL语句

                    编译器:把HQL语句翻译成mapreduce程序

                    优化器:优化代码

                    执行器:将代码交给yarn

        Hadoop

                    使用mapreduce计算模型

                    使用hdfs进行存储hive中的表数据


三 Hive的安装使用

 1、解压tar包
  tar -zxf apache-hive-1.2.1-bin.tar.gz -C /opt/modules/apache
 重命名:mv apache-hive-1.2.1-bin hive-1.2.1
 2、进入conf目录:
 修改名称
  mv hive-env.sh.template hive-env.sh
 配置环境:
  HADOOP_HOME=/opt/modules/apache/hadoop-2.7.3
  export HIVE_CONF_DIR=/opt/modules/apache/hive-1.2.1/conf
 3、启动hive之前:
  先把hadoop相关的服务开启:sbin/start-all.sh
     bin/hdfs dfs -mkdir       /tmp
     bin/hdfs dfs -mkdir  -p   /user/hive/warehouse
     bin/hdfs dfs -chmod g+w   /tmp
     bin/hdfs dfs -chmod g+w   /user/hive/warehouse
 
  复制模板: cp hive-default.xml.template hive-site.xml
 先删除原有的3000多行,把hive.metastore.warehouse.dir配置进去
  

<property>
   <name>hive.metastore.warehouse.dir</name>
   <value>/user/hive/warehouse</value>
   <description>location of default database for the warehouse</description>
  </property>


四 Hive客户端的基础语句:

1、进入到hive的客户端:bin/hive
 2、查看数据库:show databases;
 3、创建数据库:create database test;
 4、进入到数据库:use test;
 5、查看表:show tables;
 6、数据类型:

tinyint、smallint、int、bigint  -》int
  float、double、date
  string、vachar、char  -》string


 7、

create table hive_table(
  id int,
  name string
  );


 8、加载数据:
 load data local inpath '/opt/datas/hive_test.txt' into table hive_table;
  local:指定本地的数据文件存放路径
  不加local:指定数据在hdfs的路径
 9、查询语句:
 select * from hive_table;
 10、hive的默认数据分隔符是\001,也就是^A ,分割符 " ", "," ,"\t"等等
        如果说数据的分隔符与表的数据分隔符不一致的话,读取数据为null
  按下crtl+v然后再按下crtl+a就会出来^A(\001)

create table row_table(
 id int,
 name string
 )ROW FORMAT  DELIMITED FIELDS TERMINATED BY " ";  
 
 load data local inpath '/opt/datas/hive_test.txt' into table row_table;

五、hive在hdfs上的文件结构
 数据仓库的位置    数据库目录   表目录        表的数据文件
 /user/hive/warehouse   /test.db     /row_table    /hive_test.txt  
 default默认的数据库:指的就是这个/user/hive/warehouse路径


六、修改元数据存储的数据库:
 1、用bin/hive同时打开多个客户端会报错
 java.sql.SQLException: Another instance of Derby may have already booted the database /opt/modules/apache/hive-1.2.1/metastore_db.
 
 derby数据库默认只能开启一个客户端,这是一个缺陷,换个数据库存储元数据
 数据库可选有这几种:derby  mssql  mysql  oracle  postgres
 一般选择mysql元数据存储
 2、安装mysql
 查看自己虚拟机有没有mysql的安装包
  sudo rpm -qa | grep mysql
 卸载:sudo rpm -e --nodeps mysql-libs-5.1.66-2.el6_3.x86_64
 卸载完成之后再查看一下,确保卸载完成


 安装mysql服务:
 sudo yum -y install mysql-server
 (如果yum源有问题,那就更换一下yum源即可)
 安装完成之后
 sudo rpm -qa | grep mysql
  mysql-server-5.1.73-8.el6_8.x86_64
  mysql-5.1.73-8.el6_8.x86_64
  mysql-libs-5.1.73-8.el6_8.x86_64
 》查看mysql的服务
 chkconfig | grep mysql
 》开启mysqld的服务
   启动:sudo service mysqld start
   设置登陆密码:mysqladmin -u root password '123456'
   设置开机启动:sudo chkconfig mysqld on
 进入mysql:
   mysql -uroot  -p123456
  查询用户信息
  mysql> select User,Host,Password from user;
  设置远程登录权限
  mysql> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
  删除用户信息
  mysql> delete from user where user='root' and host='127.0.0.1';
  刷新信息
  mysql> flush privileges;
  重启mysqld服务
  service mysqld restart
  退出mysql客户端
  qiut+;或者crtl+C
  重启mysqld服务
  sudo service mysqld restart
 
  可选项:用Windows工具操作linux上的mysql
   授权:grant all privileges on *.* to 'root'@'192.168.111.1' identified by '123456' with grant option;
   刷新信息
   mysql> flush privileges;
 3.配置hive-site.xml
 1、修改hive-site.xml
 https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin  
 

<property> 
 
    <name>javax.jdo.option.ConnectionURL</name> 
 
    <value>jdbc:mysql://hadoop01.com/metastore?createDatabaseIfNotExist=true</value> 
 
  </property> 
 
  
 
  <property> 
 
    <name>javax.jdo.option.ConnectionDriverName</name> 
 
    <value>com.mysql.jdbc.Driver</value> 
 
  </property> 
 
  
 
  <property> 
 
    <name>javax.jdo.option.ConnectionUserName</name> 
 
    <value>root</value> 
 
  </property> 
 
  
 
  <property> 
 
    <name>javax.jdo.option.ConnectionPassword</name> 
 
    <value>123456</value> 
 
  </property>


 
 2、将驱动jar包拷贝到hive的lib目录下
    mysql-connector-java-5.1.27-bin.jar
 3、完成,可以启动hive  bin/hive 
 
 4、在mysql的metastore数据库中找到信息
 DBS:database 存储的hive数据库的信息
 TBLS:table   存储hive表的信息



七、Hive操作命令
 1、描述表信息
   

desc tablename;
    desc extended row_table;
    desc formatted row_table;


 2、修改表名

alter table  table_oldname rename to new_table_name;


 3、给表增加一个列

alter table new_table add columns(age int);
 alter table new_table add columns(sex string comment 'sex');添加注释


 4、修改列的名字以及类型

ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name];
     create table test_change(a int,b int,c int);


    修改列名 a -> a1

alter table test_change change a  a1 int;


 a1改a2,数据类型改成String,并且放在b的后面;

alter table test_change change a1  a2 string after b int;


 将c改成c1,并放在第一列

alter table test_change change c  c1 int first;


  5、替换列(不能删除列,但是可以修改和替换,)是全表替换

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) 
  alter table test_change replace columns(foo int , too string);


 
  6、清除表数据truncate
     只清除表数据,元数据信息还是存在的,表的结构已经表还是在的

truncate table row_table;


  7、删除表数据drop

drop table row_table;


  清除数据,表以及表的结构清除,元数据也清除
  8、删除数据库

drop database test_db CASCADE;


  删除数据库的信息,如果数据库不为空的话,则要加CASCADE字段
  9、查看hive自带的函数: show functions;

desc function when;
  desc function extended  when;   ->查看详细的用法


八、hive常用的linux命令选项
    查看帮助信息 bin/hive -help
    1、--database指定登陆到哪个database 下面去

bin/hive --database mydb;


 
 2、指定一条sql语句,必须用引号包裹

bin/hive -e 'show databses' 
 
 bin/hive -e 'select * from mydb.new_table'


 
 3、指定写sql语句的文件,执行sql

bin/hive -f hivesql


 指定一些较为的sql语句,周期性的执行
 
 4、查看sql语句文件

bin/hive -i hivesql


 执行文件的sql语句并进入到hive的客户端
 用来初始化一些操作
 
 5、bin/hive -S hivesql
 静默模式
 
 6、在当前回话窗口修改参数的属性,临时生效

bin/hive --hiveconf hive.cli.print.header=false;


 
 7、在hive的客户端中使用set修改参数属性(临时生效),以及查看参数的属性
  set hive.cli.print.header  -》查看参数的属性
  set hive.cli.print.header=true; -》修改参数属性
 
         8、常用的shell : ! 和 dfs
  -》! 表示访问的linux本地的文件系统 ->! ls /opt/modules/apache/
  -》dfs表示访问的是hdfs的文件系统 -> dfs -ls /;


 9、CREATE database_name[LOCATION hdfs_path]

create database hive_test  LOCATION "/location";


 自定义数据库在hdfs上的路径,把指定/location当成默认的数据库,
 所以这边数据库的名字不显示