Hive:数据仓库,其实就是写一些脚本代码(HQL),通过hive转换为java代码,在hadoop上运行。操作的是hdfs上的数据,写的HQL脚本转为mapreduce程序处理hdfs上的数据。

Hive:解释器,编译器,优化器等。解释HQL为java代码,然后编译,优化后放在hadoop上运行。

hive不是关系型数据库,不是后台的服务,它相当于是一个hadoop的客户端。

Hive:支持类似sql的查找,如果需要更改删除等操作,需要使用select语句查询出原始数据并且对源文件进行覆盖即可。


CLi

CLi是hive的指令,常用如下:

可通过 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Cli  去查看

To get help, run "hive -H" or "hive --help".
Usage (as it is in Hive 0.9.0):

usage: hive
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
 -e <quoted-query-string>         SQL from command line
   这个是在hive中执行一条sql指令
 -f <filename>                    SQL from files
   文件中存放的sql脚本,可执行
 -H,--help                        Print help information
 -h <hostname>                    Connecting to Hive Server on remote host
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
   设置hive的一些属性值等
 -p <port>                        Connecting to Hive Server on port number
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

注意:

第一:

配置hive的临时目录:因为hive运行时需要很多的临时目录,因此需要统一配置,否则会出错

[root@hadoop1 hive]# ls
bin  conf  examples  hcatalog  iotmp  lib  LICENSE  NOTICE  README.txt  RELEASE_NOTES.txt  scripts

如上,在hive下建iotmp目录,并把hive的配置文件hive-site.xml的${system:user...}的配置改为如下:

<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/root/hive/iotmp/</value>
    <description>Local scratch space for Hive jobs</description>
  </property>

第二:

因为hive是运行在hadoop上的,因此jline的版本要匹配一致,hive1.2.1使用的是jline-2.12.jar,hadoop2.5使用的是0.9的版本,分别在:

/root/hadoop/share/hadoop/yarn/lib   hadoop中

/root/hive/lib                       hive中

因此需要把hive的jline拷贝到hadoop的相应目录下。

再运行即可。



DDL(Hive Data Definition Language)+DML

DDL是hive的语句,例如创建表,修改表等。。

Hive创建的数据库,不是真正意义上的数据库,它是把hdfs上的文件转为关系型数据库的结构,这里需要一个映射关系,这种hdfs上文件与关系型结构之间的映射关系,称为元数据,这种映射关系在hive运行时,存储在一个关系型数据库中(Hive自带有),因此也可以说元数据存储在关系型数据库里。一般不要Hive自带的数据库(derby数据库),非常不稳定。

hive自带的数据库配置:(不使用)

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:derby:;databaseName=metastore_db;create=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>


安装mysql数据库:

在配好yum的基础上

yum install mysql-server  //安装
service mysqld start   //启动
netstat -nplt | grep 3306  //可以监听mysql的3306端口


mysql中可以对IP,用户名和密码进行设置,也就是设置远程登陆,要use mysql,这句的意思是进入mysql数据库,使用数据库的意思,在操作时,要选选择使用哪个数据库

例如:

grant all on *.* to root@'hadoop1' identified by '123456';

允许hadoop1这个ip用户登陆进行数据库的操作。


mysql-connector-jdbc.tar.gz解压后把jar包拷贝到hive的lib目录下,供hive使用。

因为hive要连接mysql数据库,因此需要更改hive-site.xml的配置:

connectionURL:连接mysql

connectionDriver:驱动类

username和password。


这样配置完成后,hive的作用是把HQL脚本转为mapreduce程序在hadoop上运行,其映射关系数据存在mysql中,真正的数据文件还是在hdfs上。

hive写sql,把hdfs上的文件数据映射到mysql的数据库中,mysql里有hive自己需要的tables。

在hive的bin目录下启动 ./hive

下面具体下DDL语言的使用:

基本的Hive操作流程:

    通过hive见表,用hive的load去连接数据,hive会根据建立的表的结构拆分数据,把元数据存在mysql中,load的数据会传入到hdfs中,在hdfs中会见一个hive目录,里面有库和表的名字,里面有数据。映射关系也就是元数据存在mysql中。hive中的表结构与hdfs文件的映射关系存在mysql中。元数据是为hive工作时用的,hive有表名等,找映射关系,从而找文件内容。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

操作hive时一定要先开启hadoop服务和mysql服务

在hive中建表,并且在load进去数据即可,load的数据可在hdfs中查到。

然后hive中运行HQL就能自动创建mapreduce程序对指定文件进行操作,如下:

//建表,建立表结构
hive> create table table_person (
    > id int,
    > name string)
    > ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY ',';
//导入数据,实际文件存入hdfs,映射关系存在mysql中
hive> LOAD DATA LOCAL INPATH '/root/dataFile/emp.txt' INTO TABLE table_person;
//执行HQL,转为mapreduce程序,在hadoop上运行
hive> select count(*) from table_person;
hive> desc table_person  //查看表结构

建表时,有partition功能,也就是分区,可以使得导入的文件按照指定的分区进行导入,也就是在hdfs上更具分区建立文件夹,文件夹下放的是文件。分区也就是在导入文件时可以多一层文件夹目录,方便分类。在hive中使用drop删除table时,对应的hdfs上的文件也就删除了,hive中的表和hdfs中的文件是对应关系的。hive就是建立一个表,通过表去导入数据进入hdfs,再操作表即可。

通过hive插入或者导入的数据,会在hdfs的对应文件夹下建立新的文件,除非使用overwrite。

hive> insert into table table_person values (5,'lanpishu');

在已有的表中插入数据,会在hdfs的相应文件夹下建立新的文件,存放新的数据。

hive> LOAD DATA LOCAL INPATH '/root/dataFile/emp.txt' INTO TABLE table_test PARTITION (time='20151002');
Loading data to table default.table_test partition (time=20151002)
Partition default.table_test{time=20151002} stats: [numFiles=1, numRows=0, totalSize=40, rawDataSize=0]
OK
Time taken: 1.21 seconds
hive> LOAD DATA LOCAL INPATH '/root/dataFile/emp.txt' INTO TABLE table_test PARTITION (time='20151003');
Loading data to table default.table_test partition (time=20151003)
Partition default.table_test{time=20151003} stats: [numFiles=1, numRows=0, totalSize=40, rawDataSize=0]
OK
Time taken: 0.461 seconds

根据同一个表导入两次数据,更具分区分别建立文件夹。

插入数据时,可在后面用select操作,把其他表中的数据提取出插入到新的表中,在hdfs中也就是把一个文件的某些数据提取出放入到新的文件中,提取过程就是mapreduce操作。如果建立表时有分区操作,在导入时要按区来导入。插入时也要指明区。


export和import操作:

这里的export是把hive中一个表对应的数据导出到hdfs中,一般hive操作把mapreduce的结果会存在另一个表中,继而可以导出到一个文件中。

EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])] 
  TO 'export_target_path'

https://cwiki.apache.org/confluence/display/Hive/LanguageManual

链接的Data Manipulation Statements,全是对应的操作。

group by 是分组,把整个表分成几组,可用于计数;
order by  是按某个特征来排序;

Limit 是指查询多少条,用于分页的, limit 0,2,从0开始查两条。


Hive执行HQL有三种方式:

hive -e 也就是在hive->命令行中操作,测试用;

hive -f 也就是在hive中执行HQL的脚本文件,里面有多条指令;

java代码去HQL。


使用hive作为服务端去运行(供外界java客户端直接访问,和访问mysql很像):

使用客户端去访问HIVE时,要把hive作为服务器上的服务来看待

./hive --service hiveserver2

启动hive作为服务。

启动的服务会默认监听10000端口,但是需要配置服务器监听的ip,如下:

<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>hadoop1</value>
    <description>Bind host on which to run the HiveServer2 Thrift service.</description>
  </property>

及使用hadoop1这个ip,也就是网络接口去监听端口,这样外界才会访问。

[root@hadoop1 lib]# netstat -nplt | grep 10000
tcp        0      0 192.168.1.191:10000         0.0.0.0:*                   LISTEN      3324/java

这个可以查看端口。

可以使用hive自带的客户端beeline先测试访问:

[root@hadoop1 bin]# ./beeline
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop1:10000/default
Connecting to jdbc:hive2://hadoop1:10000/default
Enter username for jdbc:hive2://hadoop1:10000/default: root
Enter password for jdbc:hive2://hadoop1:10000/default: 
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop1:10000/default> show tables;
+---------------+--+
|   tab_name    |
+---------------+--+
| table_one     |
| table_person  |
| table_test    |
+---------------+--+
3 rows selected (2.145 seconds)

如果hive在运行时缺少jar包,可以在hive中使用add jar ..添加jar包。

在eclipse中运行时,导入hive的包和hadoop的common包以及log包即可。


HQL里可以自定义函数,例如count()就是一个函数;

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

hive有两种函数:UDF和UDAF

UDF:输入数据为一条数据,输出为一条数据;

UDAF:输入为多条数据,无输出限制。