hive基础-命令&数据加载&数据导出&表属性操作
一. 执行命令方式
cli,jdbc,hwi,beeline
cli是shell执行方式,需要再集群节点或者hiveclient执行
hwi需要启动hive server在hive节点访问,beeline可以在任意节点访问
执行hadoop命令dfs -ls /;
执行shell命令!ls;
命令交互
hive -help
hive --help
hive --service -help
hive -d				#定义kv对
hive -e "hql语句"	#执行Hive语句,不进入hive
-S					#不输出
-v 					#详细信息
hive -f <filename>  #执行文件中的hql语句,不进入hive
hive -i <filename>  #执行hql语句,然后进入hive
例子:
#不打印冗余信息,只保留有用信息
hive -S -e "show tables;"
#保存到文件中
hive -S -e "show tables;" > res
list
Usage: list [FILE|JAR|ARCHIVE] [
加载进jar包
list jar	-- 显示分布式缓存有哪些jar包
source
source 
在hive中执行sql文件,比如设置参数时比较有效
hive配置变量
#设置
set val=3
#显示
set val
#使用${hiveconf:val}
select * from student_test where id=${hiveconf:a};
环境变量
linux下env查看
${env:HOME}
select '${env:HOME}' from employee; #这样会打印一些${env:HOME}
二. 数据加载
内表数据加载
创建表时加载
create table tb2 as select col1,col2 from tb1;
创建表时指定数据位置
create table tb() location '';
本地数据加载
load data local inpath 'path' [overwrite] into table tablename;
记载hdfs数据,这个操作是数据移动,不希望在集群中存在两份
load data inpath 'hdfspath' [overwrite] into table tablename;
shell或者hive中执行hadoop命令,移动数据
由查询语句加载数据
overwrite和into只能出现一个
-- 方式1:
insert [overwrite|into] table tablename
	select col1,col2
	form tb 
	where ...
--方式2:
form tb
insert [overwrite|into] table tablename
	select col1,col2
	where ...
外表数据加载
创建时指定了localtionde的位置
insert overwrite table tb2 partition(dt='20160831')
select name,student_id_list from tb;
可以类似内表,使用查询插入,也可以使用hdfs方式把文件导入到指定的位置,但是使用hdfs方式需要创建分区
分区表数据加载
内部分区表数据加载方式类似内表
外部分区表数据加载方式类似外表
插入数据时需要指定分区;
如果没有新增分区,即使目标路径下已经有数据,仍然查找不到;
采用哪种方式加载,在表名后都需要加partation(pn='')
比如:
load data local inpath 'path' [overwrite] into table tablename partition(pn='');
外部分区表需要创建分区
alter table 表名
add if not exists partition(dt='$DATE');
数据加载注意问题
分隔符,只取单分隔符
数据类型对应
- load数据,字段类型不能互相转化时,查询会返回null
- select插入字段不能互相转化时,插入数据
 select查询插入时,字段值顺序要一致,字段名可以不一致
 插入时不做检查,查询时检查
 外表分区表需要添加分区才能看到数据
三. 数据导出
1.hadoop命令方式:get/text
2.写到本地或者hdfs
insert overwrite [local] directory '/tmp/test' 
[row format delimited fields terminated by '\t']
select name,salary,Address
from employees;
3.shell命令加管道:hive -f/e | sed/grep/awk >file
4.第三方工具
四. 动态分区
不需要为不同分区添加不同插入语句
分区不确定,需要从数据中获取
设定参数,一个表一天产生的分区数不要太多
#必须设置
set hive.exec.dynamic.partition=true 				#使用动态分区
set hive.exec.dynamic.partition.mode=nonstrick		#无限制模式,如果是strick模式,必须有一个静态分区,且放在最前面
#可选设置
set hive.exec.max.dynamic.partitions.pernode=10000	#每个节点生成动态分区的最大个数
set hive.exec.max.dynamic.partitions=10000 			#一次sql查询最大生成多少个动态分区
set hive.exec.max.created.files=150000 				#一个任务最多可以创建的文件数目
set dfs.datanode.max.xcievers=8192					#限定一次最多可以打开的文件数
创建时指定partition
CREATE TABLE d_part (name string)
partitioned by (value string)
row FORMAT DELIMITED 
    FIELDS TERMINATED by '\t' 
    lines TERMINATED by '\n'
STORED as textfile;
select插入时好使,load时没成功
-- 数据先导入到d_part2中,然后select进入d_part中
insert overwrite table d_part partition(value) select name,name as value from d_part2;
可以静态分区,动态分区混合方式,这时静态分区放在最前面。
五. 表属性操作
修改表名
alter table tb rename to tb2;
修改列名把c1改名为c2,属性设置为int
alter table test add columns (value string ,  type string, col int); -- 或者指定first放在第一位
如果要把内容放在第一列,不能修改类型
增加列
alter table test change column type type string after name;
修改属性tblproperties
alter table test set tblproperties(name1=value1,name2=value2);
--修改comment
alter table test set tblproperties(comment'='xxx');
无分区表修改分隔符
alter table tb set serdeproperties('field.delim'='\t')
有分区表修改分隔符
alter table tb partition(dt='') set serdeproperties('field.delim'='\t')
分区表已存在的数据,需要指定分区,只有新增的分区才会按照修改后的内容来
修改location
alter table tb[partition(...)] set location 'path'
内部表转外部表
alter table tb set tblproperties ('external'=true)	
外部表转内部表
alter table tb set tblproperties('external'='false')
参考官方DDL:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号