Hive简介:
hive数据仓库。以Hadoop为基础,来对HDFS上的数据进行分析,会将程序执行转换为MR。
Hive不存储数据,数据还是存储在HDFS上。
Hive中数据库、表的本质,是一个目录。
改目录默认为 /user/hive/warehouse
新建一个test数据库会生成
/user/hive/warehouse/test.db目录 用来表示test数据库。
Hive通过元数据来管理表,元数据通常存储在关系型数据库中,Hive内部有一个Derby关系型数据库。

Derby数据库:小,只允许单线程操作/访问;对访问路径有要求。

一、Hive配置
-将Hive元数据配置到Mysql中:
-1.在hive conf目录中新建hive-site.xml touch hive-site.xml
-2.配置hive-site.xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop:3306/hive?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>root</value>
</property>

-3.将mysql连接Jar包导入hive-*/lib目录

二、Hive使用
Hive的元数据存储在Mysql数据库,如果Hive配置成功,会在Hive中产生一个默认的数据库default,
在没有创建其他数据库的时候,所有表都默认存储在default数据库中。
此外可以通过Mysql方言来使用Hive,比如:
创建数据库、创建表…当创建其他数据库后(test),会在默认的路径
hdfs:/user/hive/warehouse/目录下创建对应文件夹,test.db
即Hive中的数据库本质就是一个文件夹
eg1:入库

1 zhangsan
2 lisi
3 wangwu
4 mazi

创建表:

hive> create table stu(
        > id int,name string
        > )
        > row format delimited fields terminated by '\t';

导入数据:

LOAD DATA LOCAL INPATH '/data/test' INTO TABLE stu;

注: 导入本地数据 local inpath 当前文件夹下的xxx
导入hdfs数据 inpath hdfs下xxx

三、基本概念
Hive基本数据类型:
INT
BIGINT
BOOLEAN
DOUBLE
STRING
DATE
TIMESTAMP
BINARY
集合数据类型:
MAP 存储键值对元组的集合
demo:map(‘first’,‘jon’,‘last’,‘doe’) -不显示键值对
ARRAY 具有相同类型和名称的变量集合
demo:ARRAY(‘first’,‘jon’,‘last’,‘doe’)

Hive也是读时模式,在读取/查询数据才会检测文件中的数据是否为对应指定的数据类型,
如果不能转换,如将’jon’转换为int类型,就会报错。
Mysql是写时模式,在写入数据的时候,就会检测写入的数据类型是否在创建表时指定的类型是否相同。

四、数据库语句:

CREATE DATABASE IF NOT EXISTS test;

[IF NOT EXISTS]可选:
用来避免在数据库以及存在时报错

CREATE TABLE [IF NOT EXISTS]  ....
[ROW FORMAT DELIMITED FIELDS TERMINATED BY '字段分隔符']
[LINES TERMINATED BY '\n'] 换行分隔符,通常不写

注:如果创建的表不在当前数据库下,可以用 数据库.表名 指定

DESC TABLE 查看表结构
DESCRIBE FORMATTED TABLE 查看详细信息

管理表(内部表):默认建表方式都为管理表(默认表)
这种表,Hive会控制其数据的生命周期,即Hive完全控制数据。

外部表:
在创建表的时候添加external关键字。

CREATE EXTERNAL TABLE ...

内部表与外部表的区别:
在删除表的时候,外部表不会删除存储数据的目录,管理表会删除。
在删除表的时候,不管是外部表还是内部表都会删除表的元数据信息。

hive还是以HDFS为存储介质,所有存储都在HDFS。
将数据从HDFS上导入到hive表的时候,使用LOAD DATA语句时,数据位置会发生迁移。(若在本地则是复制数据)
外部表相对来说更加安全,数据组织也更加灵活,方便共享原始数据。
如果Hive可以完全控制数据,可以创建管理表,否则需要创建外部表。

分区表:减少存储空间,加快查询速度
对原来的数据按照指定的分区进行数据的重新组织,需要在创建表的时候指定分区。
分区可以同时存储多级分区。
在创建表的时候使用

PARTITIONED BY(name type...);


x