Hive学习
Author : Shan Jia-jun
Date : 2016-09-18
hive把数据组织为表,通过这种方式为存储在HDFS上的数据赋予结构
元数据存储在metastore数据库中。
hive 外壳环境
hive > show tables;
#列出hive的数据列表
#交互式环境
hive > show databases;
#列出所有的数据库;
hive > show tables in dbname;
#列出某个数据库中的表;
hive > show tables like 'h*';
#使用正则表达式列出某个以h开头的表的名字;
hive > describe databases dbname;
$ hive -f script.q
#使用-f选项可以运行指定文件中的命令
#也可以使用非交互式环境
$ hive -e 'select * from dummy'
#对于较短的脚本,可以使用-e选项在行内嵌入命令
- 建立一个较小的数据表用于测试查询
$ echo 'x' > dummy.txt
$ hive -e "create table dummy (value string);load data local inpath '/home/shanjiajun/dummy.txt' into table dummy;"
如果不想将操作运行信息打印到标准输出中,这时候可以使用-S选项,不显示打印运行的时间信息;
创建一个表并导入数据
create table records (year string, temperature int, quality int)
row format delimited fields terminated by '\t';
#该表声明的是数据文件的每一行是由制表符分隔的文本
load date local inpath 'input/ncdc/micro-tab/sample.txt' overwrite into table records;
#这一个命令告诉hive把指定的本地文件放进仓库目录中。
#但是这个操作并不解析文件或把它存储为内部数据库格式,因为hive并不强制使用任何指定文件格式。
#文件以原样逐字存储,hive并不会对文件进行修改。local为从本地上传数据。overwrite为覆盖上传.
#在hive的仓库目录中,表存储为目录。HDFS的数据表存储目录为/user/hive/warehouse
删除表
$hive -e 'drop table if exists 表名'
#删除hive中的一个表
#注意:使用hive命令删除表后,但是上传的数据并不会被删除,仅仅只是删除了一个表的目录,需要手动删除HDFS中的数据
更新
hive 不支持更新(或删除),但支持insert into ,所以可以向现有表中增加新的行。
多数据库/模式支持
hive 支持创建多个数据库或模式,可用的命令包括 SHOW DATABASES、CREATE DATABASE dbname、user dbname 以及DROP DATABASE dbname 这样的语句。如果没有明确指明数据库,那么所指定的是在default数据库中的表
托管表和外部表
#对于托管表,加载数据到托管表时,hive把数据移到仓库目录。例如:
hive > CREATE TABLE managed_table (dummy STRING);
hive > LOAD DATA INPATH '/user/tom/data.txt' INTO table managed_table;
#此时load把文件从hdfs:/user/tom/data.txt 移动到hdfs: /user/hive/warehouse/managed_table.
#对于外部表而言,外部数据的位置需要在创建表的时候声明:
CREATE EXTERNAL TABLE external_table (dummy STRING)
LOCATION '/user/tom/external_table';
LOAD DATA INPATH '/user/tom/data.txt' INTO TABLE external_table;
#只有源和目标在同一个文件系统中移动才会成功。
#当然,作为特例,如果用了LOCAL关键字,hive会吧本地文件系统的数据复制到hive的仓库目录。在其他情况下,最好把LOAD视为一个移动操作。
#使用EXTERNAL关键字以后,hive知道数据并不由自己管,因此不会把数据移动到自己的仓库目录。
#丢弃外部表时,hive不会碰数据,而只会删除元数据。
建立外部分区表
创建一个外部表:
create external table user_action_201608
(type STING,userid string,region string,action string)
partitioned by (day string)
row format delimited
fields terminated by '|'
location '/cucrz/data/look/1901/2016/08';
修改表创建分区
alter table user_action_201608 add partition (day='01')
location '01';
alter table user_action_201608 add partition (day='02')
location '02';
alter table user_action_201608 add partition (day='03')
location '03';
...
#查询:
select * from user_action_201608 limit 10;