类型转换
hive原子数据类型可以进行隐式数据类型转换,如果某个表达式使用INT,那么TINYINT会转化为INT,hive不会进行反向转换,除非使用cast才操作。
数据类型转化规则:
任何整数类型都会转换为范围更广的类型。
所有整数类型、FLOAT、STRING类型都能隐式转换为double类型。
TINYINT、SMALLINY、INT都可以转换为FLOAT
BLOOEAN 不能转换为任何其他数据类型
cast进行显式数据类型转换:
eg:CAST(‘1’,AS INT) 将字符串’1’转换为整数值 1
如果cast执行转换失败,表达式会返回空值NULL
复杂数据类型:
hive有三种复杂数据类型:ARRAY、MAP和STRUCT .
ARRAY和MAP和java中的同名数据类型类似,STRUCT是记录类型,它封装一个字段的命名集合 。
复杂数据类型允许任意层次的嵌套。
复杂数据类型声明必须使用尖括号符号指明其中的数据字段类型。
eg:
CREATE TABLE complex(
col1 ARRAY<INT>,
col2 MAP<STRING,INT>,
col3 STRUCT<a:STRING,b:INT,c:DOUBLE>
);
下面展示每种类型的字段访问操作:
select col1[0],col2[‘b‘],col.c FROM complex;
操作与函数:
hive提供的操作包括:
关系操作:等值判断(x=’a’),空值判断(x IS NULL),模式匹配(x LIKE ‘A%’)
算术操作:加法:x+1
逻辑操作:逻辑或OR(x OR y)
在mysql和hive中,字符串连接用concat函数
hive内置函数:
hive提供了很多内置函数,分为这几大类:
数学和统计函数、字符串函数、日期函数、条件函数 、聚集函数以及处理 XML(使用xpath函数)和JSON 函数。
在hive外壳环境中用 show functions 可以获取函数列表,要了解具体函数使用帮助使用describe命令 :
describe function length;
表:
hive表格逻辑上由存储的数据和描述数据格式的元数据组成,数据一般存放在HDFS中,也可以存放在其他hadoop文件系统中,包括 本地系统和S3。hive把元数据存放在关系型数据库中。
托管表和外部表
hive创建表,默认是hive负责管理数据,hive把数据移入它的“仓库目录”。另一种方式是外部表,这样hive可以访问仓库目录以外的数据。
两种表的区别在load和drop的语义上:
托管表:把数据加载到托管表时,hive会把数据数据移到仓库目录。
eg:
create table t1( dummy String);
load data inpath ‘/usr/tom/test.txt‘ into table t1;
把文件hdfs://usr/tom/test.txt移动到hive的仓库目录中,即hdfs://usr/hive/warehouse/t1。
加载操作仅是文件系统中文件的移动,即便是托管表,也不检查数据和表中声明的模式是否匹配,通过查询为缺失的字段返回为NULL,从而检查数据是否被正确解析。
要丢弃一个表:
drop table t1;
这个表会被删除,包括表的元数据和数据,load是一个移动操作,drop是一个删除操作。数据会彻底消失,这就是hive托管数据的定义。
外部表:与托管表不同的是,外部表由你来控制控制数据的创建和删除, 外部数据的位置需要在创建表的时候指明:
create external table t2(dummy String)
location ‘/usr/tom/t2‘ ;
load data inpath ‘/usr/tom/test.txt‘ into table t2;
使用external 关键字,hive知道数据并不由自己管理,因此不会把数据移到自己的仓库目录。事实上, 在定义时,hive不会检查外部位置是否存在,这样的话就可以 把创建数据推迟到创建表后进行。
丢弃外部表,hive不碰数据,只会删除元数据。
如何选择使用哪种表:
除drop语义外,两种方式没有多大区别。所有处理都有hive完成,应该使用托管表。如果用hive和其他工具来处理统一数据。应该使用外部表。普遍做法是把HDFS(由其他进程创建)的初始数据集用作外部表使,然后用hive的变换功能把数据移到托管的hive表,反之也成立。外部表(未必在hdfs中)可以用于从 hive导出数据供其他应用程序使用。使用hive的另一个原因是为同一数据关联不同模式。
小结:
主要学习hive里的hive原子类型转换、复杂数据类型、操作与函数、hive的表,分为托管表和外部表,它们的定义、区别和什么时候使用,它们最大的区别在与drop语义不同,托管表里的drop操作会删除掉表的元数据和数据,而外部表只会删除掉元数据。
版权声明:本文为博主原创文章,未经博主允许不得转载。