hive基础-数据类型&表操作

一. 数据类型

基础数据类型

数据类型 所占字节 开始支持版本
TINYINT 1byte,-128 ~ 127
SMALLINT 2byte,-32,768 ~ 32,767
INT 4byte,-2,147,483,648 ~ 2,147,483,647
BIGINT 8byte,-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
BOOLEAN
FLOAT 4byte单精度
DOUBLE 8byte双精度
STRING
BINARY 从Hive0.8.0开始支持
TIMESTAMP 从Hive0.8.0开始支持
DECIMAL 从Hive0.11.0开始支持
CHAR 从Hive0.13.0开始支持
VARCHAR 从Hive0.12.0开始支持
DATE 从Hive0.12.0开始支持

复杂数据类型

  • ARRAY:ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的;
  • MAP:MAP包含key->value键值对,可以通过key来访问元素。比如”userlist”是一个map类型,其中username是key,password是value;那么我们可以通过userlist['username']来得到这个用户对应的password;
  • STRUCT:STRUCT可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如user是一个STRUCT类型,那么可以通过user.address得到这个用户的地址。
  • UNION: UNIONTYPE,他是从Hive 0.7.0开始支持的。

Struct使用
select * from 表,这种形式不走mapreduce,查找某字段才通过mapreduce。
和map类似,只是使用.访问,但是struct只存一组集合,map可以存多组,比如:

STRUCT{a:INT; b:INT}

我们可以通过c.a来访问域a
建表

create table student_test(id INT, info struct<name:STRING, age:INT>)  
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|'                         
COLLECTION ITEMS TERMINATED BY ',';      -- struct内部分隔                             

导入数据

$ cat test.txt   
1|zhou,30
2|yan,30 
3|chen,20
4|li,80

load数据

LOAD DATA LOCAL INPATH 'data' overwrite INTO TABLE student_test;  

查询struct

select info.age from student_test; 

Array使用
数据中不能出现多余的不可见字符

create table class_test(name string, student_id_list array<INT>)  
ROW FORMAT DELIMITED                                              
FIELDS TERMINATED BY '|'                                          
COLLECTION ITEMS TERMINATED BY ',';  	-- 很多个

数据

034|1,2,3,4  
035|5,6  
036|7,8,9,10  

导入

LOAD DATA LOCAL INPATH 'data' overwrite INTO TABLE class_test ;  

通过下标查找

select student_id_list[1] from class_test;

Map使用

create table employee(id string, perf map<string, int>)       
ROW FORMAT DELIMITED                                          
FIELDS TERMINATED BY '|'                                
COLLECTION ITEMS TERMINATED BY ','      -- map有很多个k-v对                  
MAP KEYS TERMINATED BY ':'; 

数据

1|job:80,team:60,person:70  
2|job:60,team:80  
3|job:90,team:70,person:100  

插入

LOAD DATA LOCAL INPATH 'data' overwrite INTO TABLE employee;
select perf['person'] from employee where perf['person'] is not null; 

查找map

select perf['person'] from employee;

通过desc formatted 表名查看具体的分隔符
数据类型转换

文件
文件格式

  • textfile(文本)
  • sequencefile(二进制)
  • rcfile(列式)

扩展接口

  • 默认文件读取
  • 自定义inputformat
  • 自定义serde

二. 表

2.1 创建表

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]

ROW FORMAT
指定分隔符,一般使用默认,可以用户定义

ROW FORMAT DELIMITED 
	[FIELDS TERMINATED BY char] 
	[COLLECTION ITEMS TERMINATED BY char]
    [MAP KEYS TERMINATED BY char] 
    [LINES TERMINATED BY char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

例子:

CREATE TABLE [EXTERNAL] employees (
 	name string,
 	salary float,
 	subordinates array<string>,
 	deductions map<string,float>,
 	address struct<street:string,city:string,state:string,zip:int>
 )
row FORMAT DELIMITED 
	FIELDS TERMINATED by '\t' 
	lines TERMINATED by '\n'
STORED as textfile;

查看表的完整信息

desc formatted 表名

例子:

-- 创建简单表
CREATE TABLE pokes if not exists (foo INT, bar STRING);

-- 创建外部表
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User',
     country STRING COMMENT 'country of origination')
 COMMENT 'This is the staging page view table'
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
 STORED AS TEXTFILE
 LOCATION '<hdfs_location>';

-- 创建分区表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(date STRING, pos STRING)
ROW FORMAT DELIMITED ‘\t’
   FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;

-- 创建Bucket表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(date STRING, pos STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED ‘\t’
   FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;

由一个表创建另一个表

create table tb2 like tb2

查询创建表

create table t2 as select name,addr from t1;

2.2 自定义文件格式

stored as textfile

  • 直接查看hdfs
  • haddoop fs -text
    stored as sequencefile
  • 序列化文件,不能通过hdfs,需要使用haddoop fs -text
    stored as rcfile
  • hive -service rcfilecat path #hadoop不能读取,需要hive命令读
    stored as inputformat 'class'
  • outformat 'class'
    不同的存储方式,区别在于inputformat和outputformat,使用的类不同,可以学习一源码
    自定义方式,就是重写输入和输出流

需要新建jar包

  • 方式1:hive中执行add jar path
  • 方式2:jar包拷贝到hive的lib目录下
create table if not exists testiputformat(name string, addr string)
row format delimited fields terminated by '|'
stored as inputformat 'com.peixun.inputformat.UDInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat';

2.3 SerDe

序列化与反序列化
使用FileFormat读写表的行
HDFS文件->ImputFileFormat->->deserializer->row对象
row对象->serializer->->OutFileFormat->HDFS文件
读源码

2.4 分区

-- 增加分区
alter table employees add if not exists partition(dt='$DATA')
-- 删除分区
alter table employees drop if exists partition(dt='$DATA')

2.5 分桶

比分区更细粒度
Hive针对一列分桶
Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中
好处:

  • 获取更高的查询处理效率
  • 使取样更高效

创建带桶的table

create table bucketed_user(id int,name string) 
clustered by (id) sorted by(name) into 4 buckets -- 设置分成4个桶,按照id聚集,按name排序
row format delimited 
fields terminated by '\t' stored as textfile; 
set hive.enforce.bucketing=true;
posted @ 2016-08-30 21:51  zhangshihai1232  阅读(147)  评论(0)    收藏  举报