Hive数据仓库之快速入门

Hive定位:ETL(数据仓库)工具
将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的工具,如像:kettle

有关Hive数据导入导出mysql的问题请查看《 如何利用sqoop将hive数据导入导出数据到mysql

DML

批量插入/批量导入
LOAD  DATA [ LOCAL] INPATH 'filepath' [OVERWRITE] INTO  TABLE tablename [ PARTITION (partcol1=val1, partcol2=val2 ...)]
注:filepath可以是hdfs路径或者是S3路径,如hdfs://namenode:9000/ user/hive/ project/data1
1.从本地文件导入到表
load  data  local inpath 'test.txt'  into  table  test;
2.从hdfs导入到表
load  data inpath '/home/test/add.txt'  into  table  test;
3.从表查询中导入到表
insert  into  table  test  select  id, name, tel from  test;
4.将查询数据导入到多个表
from source_table
insert  into  table  test  select  id, name, tel from dest1_table select src.* where src. id < 100
insert  into  table  test  select  id, name, tel from dest2_table select src.* where src. id < 100
insert  into  table  test  select  id, name, tel from dest3_table select src.* where src. id < 100;
5.建表时导入
create  table test4 as  select  id, name, tel from  test;
指定分隔符导出数据
insert overwrite local  directory '/home/hadoop/export_hive' 
row  format  delimited 
fields  terminated  by '\t' 
select * from  test;
删除/清空
1.删除table1中不符合条件的数据
insert overwrite table table1
select * from table1 where XXXX;
2.清空表
insert overwrite table t_table1
select * from t_table1 where 1=0;
3.截断表(注:不能截断外部表)
truncate  table table_name;
4.删除hdfs对应的表数据达到清空表(表结构依然存在)
hdfs dfs -rmr /user/hive/warehouse/test
 
注:1和2本质是覆写表来实现清除数据
delete 与 update
在hive中默认不支持事务,因此默认不支持delete与update,如果需要支持必须在hive-site.xml中配置打开

DDL

库/表/索引/视图/分区/分桶
数据库
列出/创建/修改/删除/查看信息
1.列出所有数据库
show  databases;
2.创建数据库
create  database  test;
3.删除
drop  database  test;
 
处于安全原因,直接 drop有数据的数据库会报错,此时需要 cascade关键字忽略报错删除
drop  database  if  exists  test  cascade;
4.查看数据库信息
describe  database  test;
列出/创建/修改/删除/查看信息
1.列出所有表
 
当前数据库的所有表
show  tables;
 
指定数据库的所有表
show  tables  in db_name;
 
支持正则
show  tables '.*s';
2.创建表
create  table  test
( id int,
a string
)
ROW  FORMAT  DELIMITED        行分割
FIELDS  TERMINATED  BY ‘,’    字段分隔符
LINES  TERMINATED  BY ‘\ n’    行分隔符
STORED  AS TEXTFILE;         作为文本存储
创建基于正则切分行字段的表
add jar ../build/contrib/hive_contrib.jar;
 
CREATE  TABLE apachelog (
host STRING,
identity  STRING,
user  STRING,
time  STRING,
request STRING,
status  STRING,
size  STRING,
referer STRING,
agent  STRING)
ROW  FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|//[[^//]]*//]) ([^ /"]*|/"[^/"]*/") (-|[0-9]*) (-|[0-9]*)(?: ([^ /"]*|/"[^/"]*/") ([^ /"]*|/"[^/"]*/"))?",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED  AS TEXTFILE;
3.修改
加一个新列
ALTER  TABLE  test  ADD  COLUMNS (new_col2 INT  COMMENT 'a comment');
 
改表名
ALTER  TABLE old_name RENAME  TO new_name;
4.删除
drop  table  test;
5.查看信息
 
显示列信息
desc  test;
 
显示详细表信息
desc formatted test;
索引
创建索引
CREATE  INDEX index_name   
ON  TABLE base_table_name (col_name, ...)  
AS 'index.handler.class.name'
 
如: DROP  INDEX index_name ON table_name  
 
重建索引
ALTER  INDEX index_name ON table_name [ PARTITION (...)] REBUILD  
 
如: alter  index index1_index_test on index_test rebuild
 
删除索引
DROP  INDEX index_name ON table_name  
 
列出索引
show  index  on index_test;
视图
CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT
 
注:hive只支持逻辑视图,不支持物化视图
?增加视图
?如果没有提供表名,视图列的名字将由定义的SELECT表达式自动生成
?如果修改基本表的属性,视图中不会体现,无效查询将会失败
?视图是只读的,不能用LOAD/INSERT/ALTER
?删除视图  DROP VIEW view_name
 
分区(重点)
列出/创建/修改/删除
1.列出一个表的所有分区
show   partitions  test;
2.创建分区表
create  table  test
( id int,
a string,
)
partitioned by (b string, c int)
ROW  FORMAT  DELIMITED
FIELDS  TERMINATED  BY ‘,’
LINES  TERMINATED  BY ‘\ n
STORED  AS TEXTFILE;
3.对现有表添加分区
ALTER  TABLE  test  ADD  IF  NOT  EXISTS
PARTITION ( year = 2017) LOCATION ‘/hiveuser/hive/warehouse/data_zh.db/data_zh/2017.txt’;
4.删除分区
ALTER  TABLE  test  DROP  IF  EXISTS  PARTITION( year =2017);
5.加载数据到分区表
LOAD  DATA INPATH ‘/ data/2017.txt’ INTO  TABLE  test  PARTITION( year=2017);
6.未分区表数据导入分区表
insert overwrite table part_table partition ( YEAR, MONTH) select * from no_part_table;
7.动态分区指令
set hive.exec.dynamic. partition=true;
set hive.exec.dynamic. partition. mode=nonstrict;
# set hive.enforce.bucketing = true;
 
开启动态分区后导入数据时可以省略指定分区的步骤
LOAD  DATA INPATH ‘/ data/2017.txt’ INTO  TABLE  test  PARTITION( year);
分桶
CREATE  TABLE bucketed_user ( id INT) name  STRING)
CLUSTERED BY ( id) INTO 4 BUCKETS;
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31494694/viewspace-2147887/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31494694/viewspace-2147887/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值