Hive数据类型
基本数据类型
tinyint,smallint,int,biging,float,double,decimal,char,varchar,string,binary,boolean,timestamp,date,
引用数据类型
Array:相同数据类型组合的数组,使用array[1]访问
MAP:Key-value键值对,通过键进行访问,使用map['key']访问
STRUCT:结构体类型,用来存储不同数据类型的数据,是用struct.key访问
类型不区分大小写
Hive使用的文件
textfile:文本格式
SequenceFile:序列化文件(存储的是二进制)
RcFile:列是文件存储格式
Hive基本使用表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [COMMENT col_comment],...)] [PARTITIONED BY(col_name data_type [COMMENT col_comment],...)] [CLUSTERED BY (col_name,col_name2,...) SORTED BY(col_name [ASC|DESC],...)] INTO num_buckets BUCKETS]
[
[ROW FORMAT row_format][STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES(...)]
]
[LOCATION hdfs_path]
[AS select_statement]
EXTERNAL:是内部还是外部表
PARTITIONER BY :根据指定列进行分区
CLUSTERED BY:按照某一个字段将相同数据聚到同一个reduce中
BUCKETS:分桶,根据哈希值进行分桶
LOCATION:创建表,其文件在在集群的位置
AS:查询值同时添加到表中
例子:
CREATE TABLE IF NOT EXISTS employees(
name string,
salary float,
subordinates array,
deductions map,
address struct
)row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' lines terminated by '\n' stored as textfile location '/data/';
查看表结构:
desc table_name;
详细信息
desc extended table_name;
格式化后的详细信息
desc formatted table_name;
删除表
drop table table_name;
外部表与内部表的区别:
如果内部表,在删除表之后会将表数据从HDFS中删除,而外部表只删除表的元数据信息,并不会删除表中的数据。
查询字段,如果是array类型可以通过下标
select subordinates[1] from employees;
查询如果是map,使用col_name['key']
查询如果是struct,使用col_name.steet
show tables 显示当前数据库中的表
desc [extended | formatted] table_name 显示表的结构
show create table tablename 显示创建表的语句
drop table tablename 删除表
create table test1 like test2 复制表结构,但是表中数据并没有加载过来
create table test4 as select name,addr from test5 根据test5的name和addr创建test4表,并且将test5中name和addr数据内容加载到test4中(select中不能查*)
hive不同文件读取:
stored as testfile
直接查看HDFS
通过hdfs dfs -test查看
stored as sequencefile
通过hdfs dfs -test查看
stored as rcfile
hive -service rcfilecat path
stored as inputformat 'class' outputformat 'class'
四种主要的区别是inputformat 和 outputformat不同
hive中加载jar包(当次会话有用,如果多次需要加到lib目录下)
add jar path/..jar
Hive使用SerDe
SerDe是Serializer和Deserializer的缩写即序列化与反序列化
Hive读写数据的顺序
HDFS->inputfileformat-> -> deserializer -> row对象
row对象 -> serializer -> ->outputFileFormat -> HDFS文件
Hive分区
为了避免查询过程中消耗很长时间进行查找整个表,可以使用分区,查找特定分区中的内容,从而节省时间。
分区语句
create table tablename(
name string
....
)
partitioned by(col_name type,...) 这个分区字段和上面定义的字段不同,定义分区字段可以有多个用于分区后在对内容进行分区,相当于一级分区二级分区,注意和顺序有关的
其实分区就是在HDFS下对应表中创建目录,这样以后查询的时候直接去对应目录下进行查找
添加分区语法:
alter table table_name add [if not exists] partition(col_name=par_con)
注意这种添加分区方法前提是在创建表的时候已经创建了col_name分区
删除分区
alter table table_name drop [if exists] partition(col_name=par_com)
查看分区
show partitions table_name
数据加载到分区:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE table_name [partition(dt=..,hour=..)]
Hive分桶
对于某个表或者某个分区,hive进一步的组织成桶,也就是说桶是更细粒度范围的划分
hive针对某一列进行分桶
hive采用对列进行hash取值,然后使用该值对桶的个数取余的方式决定该条记录放在哪个桶中
与分区一样都是为了提高查询的效率
查找
select [ALL|DISTINCT] col_name frwom table_name [where col_name=..]