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

posted @ 2016-08-31 18:06  zhangshihai1232  阅读(536)  评论(0)    收藏  举报