Hive目录的说明
  ● bin:    
        包含了各种Hive服务的可执行文件例如CLI命令行界面
  ● .hiverc:
        位于用户的主目录下的文件,如果不存在可以创建一个
        里边的命令可以在启动CLI时,会先自动执行!
  ● metastore(元数据存储):
    Hive所需要的组件只有元数据信息是hadoop没有的,它存储
    了表的模式和分区信息等元数据信息,用户在执行create table x..
    或者alter table y...时会指定这些信息!
    Hive会将元数据的信息存储到Mysql中
  ● .hivehistory:
        存储执行的历史命令

1.Hive中的数据类型:
基本数据类型:
tinyint:1byte
smalint:2byte
int:4byte
bigint:8byte
boolean:true or false
float:单精度浮点数
double:双精度浮点数
string:字符序列
timestamp:整数,浮点数或者字符串
binary:字节数组

集合数据类型;
struct:
    struct('john', 'doe')
map:
    map('first','join','last','doe')
array:
    array('john', 'doe')
------------------------示例----------------------
create table employee(
   name         string,
   salary       float,
   subordinates array<string>,      //数组类型
   deductions   map<string, float>,     // map类型
   address      struct<street:string, city:string, state:string, zip:int>   // 结构体类型
)
row format delimited          // 这组关键字是必须写在前面的
fields terminated by '\t'   // 每列用‘\t’分隔
collection items terminated by ',';     // 集合间的元素用,分隔

// 说明:struct类型貌似和array类型的区别:
//  struct类型里边可以拥有更多种的数据类型,
//  array类型只有一种数据类型(string类型)

2.Hive中关于库的概念以及操作
  ● Hive中数据库的概念:
        仅仅是存放表数据的一个目录或者命名空间
  ● Hive会为每个数据库创建一个目录:
        数据库中的表将会以这个数据库的子目录形式存储(default例外)
        在/user/hive/warehouse/table_name/表文件    (位于HDFS中)
  ● Hive不支持行级插入操作,更新操作和删除操作。也不支持事务


----------------------操作数据库----------------------------

hive>show tables;   // 显示当前工作目录下的表

hive>show tables in mydb;   // 显示指定数据库下的表

hive>show databases like 'h.*';     // 显示以h开头的数据库

hive>create table person2 like person;      // 拷贝一张一模一样的表

hive>create database mydb location '/home/wenpu_di/';   // 指定创建的数据库目录的存放位置 -> location

hive>create database mydb location '/home/diwenpu/' comment 'my database';  
//  comment(注释部分): my database是关于这个数据库的说明文字

hive>drop database mydb cascade;    // 删除非空的数据库(含有表)

3.Hive中表的基本操作

hive>create table table1(i int, name string);   // 建表操作

hive>desc table1;   // 查看表结构

hive>drop table table1;     // 删除表

// 修改表,只会修改元数据的但不会修改数据本身

hive>alter table mytable rename to MYTABLE;     // 重命名


hive>alter table mytable add columns(name string, age int); // 添加新的字段

hive>alter table add partition(year=2011, month=1, day=1) location '/log/data1';
// 该命令只能操作分区表
  ● 外部表:
Hive不完全拥有该表,删除该表并不会删除掉表中的这份数据,
不过描述表的元数据信息会被删除掉 
//创建一个外部表:
create extenal table stocks(
    age int,
    name string
)
row format delimited 
fields terminated by ','
location '/data/stocks';    // 分号在结尾

// 说明:
// extenal:说明这个表是非分区外部表,后边的location:
// 告诉Hive数据在那个路径下边

hive>desc extended tablename;   // 显示表示管理表还是外部表

// tableType:MANAGED_TABLE:管理表
// tableType:EXTERNAL_TABLE:外部表

  ● 分区表:    
分区表改变了Hive对数据存储的组织方式。

// 分区表的创建
create table employees(
    name string,
    salary float,
    subordinates array<string>,
    deductions map<string, float>
    address     struct<street:string, city:string, state:string, zip:int>

)
partitioned by (country string, state string);

// 分区字段:country state 用户不需要关心这些字段是不是分区字段

hive>describe extended employee;    // 查看分区键

hive>show partitions employees;     // 查看表中存在的所有分区

hive>show partitions employees partition(country='US'); //查看表中的多个分区
country=US/state=AL
country=US/state=AK
...

hive>show partitions employees partition(country='US', state='AL')  //查看表中的一个指定分区
country=US/state=AL


// 增加一个分区:alter table table_name add partition(...)
hive>alter table log_message add partition(year=2012, month=1, day=2)
location 'hdfs://master:9000/S1/data';

// 将分区路径指向其他路径(修改分区路径),改变表存储路径
hive>alter table log_message partition(year=2011, month=12, day=2)
set location 'hdfs://master:9000/S2/data'

// 删除某个分区
hive>alter table log_message drop partition(year=2011, month=12, day=2);

// 将指定位置的数据拷贝到指定的分区下边去
hive>load data local inpath '/home/wenpu_di/sougou.txt' into table employee partition(country='US', state='AL');
// 注意:指定的路径下边的数据要和你设定的分区匹配才行
// 即:它会去读取数据但是不保证里边的数据都符合制定分区的要求
4.装载数据
  ● load指定文件路径加载
hive>load data local inpath '/home/wenpu_di/data.txt' overwrite into table employee partition(country='US', state='CA');
说明:
// inpath:指定的路径下不能含有文件夹
// 如果目标分区不存在的话,那么先创建这个分区在将数据拷贝到目录下
// 如果目标表是非分区表,那么语句中应该省略partition子句
// local关键字
// 注意:加上local:代表拷贝本地数据到HDFS上的目标位置
// 不加local代表转移数据到目标位置
// 即将"hdfs://master:9000/S/data"  转移到 “表所在的位置”
  ● 单个查询语句中创建表并加载数据
create table ca_employee as 
select name, salary, address from employee 
where state='CA';
// 从一个大的宽表中选取需要的数据集,但是这个功能
// 不能用于外部表。
  ●  以一个表的查询结果作为另一个表的输入
insert overwrite table sougou select uid,url from sougou500;
5.join连接
1.内连接:
    select a.no,b.no from a join b on a.no = b.no;
内连接只会保留两个表中相等的字段

2.left outer join
    select a.no,b.no from a left outer join b on a.no = b.no;
左外连接:以左表为基准表,左表中不符合条件的记录也会保留但是对应的右表的是null
即:左表的记录都会出现,不满足On条件的右边补null

3.right outer join
    select a.no,b.no from a right outer join b on a.no = b.no;
右外连接:以右表为基准,右表中不符合条件的记录也会保留但是对应的左表的是null
即:右表的记录都会出现,不满足On条件的左边补null

4.full outer join
    select a.no,b.no from a full outer join b on a.no = b.no;
左右表中的记录都会出现,左表中不匹配的右表补null,右表中不匹配的左表补null

5.left semi join 
    select a.no,b.no from a left semi join b on a.no = b.no;
把,a表中在b表中出现的过记录统计出来:
    即:以a表为基准只要a表中的记录在b表中出现过就统计出来(重复出现的只统计一次)

6.map 连接
在mapper的内存中执行连接操作
select /*+MAPJOIN(a)*/ a.no,b.no from a join b on a.no = b.no;
7.其他特殊操作
#hive -e "desc database test";      // -e: 执行完这条语句会自动退出CLI

#hive -S -e "desc database test" >>  /home/diwenpu/temp.txt // -S:开启静默模式去掉OK和用时; -e:立即退出CLI

#hive -f /home/wenpu_di/hive.sql        // 运行一个sql命令集,-e和-f不能一起用
#cat hive.sql   
use database1;
select * from sougou limit 5
...