HIVE基本语法以及HIVE分区
HIVE小结
HIVE基本语法
HIVE和Mysql十分类似
 建表规则
  CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
  [(col_name data_type [COMMENT col_comment], ...)] 
  [COMMENT table_comment] 
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
  [CLUSTERED BY (col_name, col_name, ...) 
  [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
  [ROW FORMAT row_format] 
  [STORED AS file_format] 
  [LOCATION hdfs_path] 
CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
LIKE 允许用户复制现有的表结构,但是不复制数据
COMMENT可以为表与字段增加描述
创建表
 hive> CREATE TABLE IF NOT EXISTS test1
 > (id INT,name STRING);
删除表
 drop table test1;
 查看表结构
 desc test1;
 修改表名
 alter table test1 rename to test2;
 修改表结构
 alter table test1 add columns(address string ,grade string);
 创建和已知表相同结构的表
 create table test3 like test1;
 加载本地数据
 load date local inpath '/home/date/' into table test1;
 注意可以在into 前面添加overwrite表示覆盖之前在test1的数据,如果没有就表示加载本地数据在原始数据的后面
 加载hdfs的文件
 首先将文件上传到hdfs文件系统对对应的目录上
 hadoop fs -put /home/.txt /usr/
 然后加载hdfs中的数据
 load data inpath /usr/ into table test1;
插入数据
 insert overwrite table test2 select * from test1;
 查询数据
 和mysql语法上没甚没区别
- 查询单个字段的数据
 - where条件查询
 - all和distinct
 - limit限制查询
 - group by
 - order by
 - sort bu
 - distribute by
 - cluster by
 
HIVE分区
hive分区是为了更方便数据管理,常见的有时间分区和业分区
    create table t1(
    id      int
    ,name    string
    ,hobby   array<string>
    ,add     map<String,string>
    )
    partitioned by (pt_d string) 
需要注意的是分区字段不能和表中的字段重复,否则就会报错:
    FAILED: SemanticException [Error 10035]: Column repeated in partitioning columns 
我们在加载数据的时候也可以分区加载
load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( pt_d = '201701'); 
之后我们再将同一份数据加载到不同的分区中
load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( pt_d = '000000'); 
查询一下数据 select * from t1;
1   xiaoming    ["book","TV","code"]    {"beijing":"chaoyang","shagnhai":"pudong"}  000000
2   lilei   ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"}   000000
3   lihua   ["music","book"]    {"heilongjiang":"haerbin"}  000000
1   xiaoming    ["book","TV","code"]    {"beijing":"chaoyang","shagnhai":"pudong"}  201701
2   lilei   ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"}   201701
3   lihua   ["music","book"]    {"heilongjiang":"haerbin"}  201701 
创建分区除了在创建表的时候启动partition by实现,还可以
 alter table t1 add partition (pt_d string)
 这样就创建了一个分区,这时会看到hive在hdfs中创建了相应的文件夹
查询相应的分区的数据
select * from t1 where pt_d = ‘000000’ 
添加分区,增加一个分区文件
alter table t1 add partition (pt_d = ‘333333’);  
删除分区(删除对应的分区文件)
 注意,对于外表进行drop partition并不会删除hdfs上的文件,并且通过msck repair table table_name同步回hdfs上的分区。
alter table test1 drop partition (pt_d = ‘20170101’); 
查询分区
show partitions table_name; 
修复分区
 修复分区就是重新同步hdfs上的分区信息。
msck repair table table_name; 
插入数据
insert overwrite table partition_test partition(stat_date='2015-01-18',province='jiangsu') 
select member_id,name from partition_test_input 
where stat_date='2015-01-18' 
and province='jiangsu'; 
内部表和外部表的区别
Hive中表与外部表的区别:
 1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而表则不一样;
 2、在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
 那么,应该如何选择使用哪种表呢?在大多数情况没有太多的区别,因此选择只是个人喜好的问题。但是作为一个经验,如果所有处理都需要由Hive完成,那么你应该创建表,否则使用外部表!
                    
													
													
													
													
	
		
