hive-2

来源:互联网 发布:一身份证创建2个淘宝店 编辑:程序博客网 时间:2024/05/29 17:18
章节二
hive元数据
hive将元数据存储在RDBMS中,需要在hive-site.xml中修改相应的属性;
其中元数据代表信息数据字典为:
BUCKETING_COLS:hive表clustered by字段信息;
cloumns:hive表字段信息(字段注释,字段名,字段类型,字段序号等等);
DBS:元数据信息,存放HDFS路径信息;
NUCLEUS_TABLES:元数据表和hive中class类的的对应关系;
Partitions:hive表分区信息,创建时间和创建具体分区等等;
partition_keys:分区表键(名称,类型,comment,序号)
partition_key_vals:hive表分区名;
SDS:所有表中的目录以及格式;
SD_PARAMS序列化以及反序列化的信息比如分隔符;
SEQUENCE_TABLE:hive对象的下一个可用ID;
SERDEShive表序列化以及反序列化使用的类库信息;
SERDE_PARAMS:也是序列化和反序列化的信息;
SORT_COLS:hive表Sorted by字段信息(字段名,sort类型,字段序号);
TABLE_PARAMS:表级属性,如是否为外部表,表注释等等;
TBLS:所有hive表的基本信息;
DAO方法(data access Object)
数据访问接口
存储元数据mysql
安装mysql
apt-get install mysql-server
service ssh start
在hive-site.xml中设置相应的本地存储位置,mysql用户,密码,数据库等;
还要将jdbc的jar包mysql-connector-java-5.1复制到hive的lib目录下;
hive的数据存储
首先hive没有专门的数据存储格式,也没有为数据建立索引,用户可以自由的组织hive中的表;只需要在创建表的时候告诉hive数据中的行分隔符和列分隔符;hive就可以解析数据;
hive中的所有数据都是存储在HDFS中,hive中的数据模型包括Table,External(外部),Table,Partition,bucket;

hive表与数据库中的表在概念上类似,每一个表在hive上都有相对的目录存储数据在hdfs上;hive-site.xml中的${hive.metastore.warehouse.dir]指定数据仓库的目录;
partition对应数据库中的Partition列的密集索引(分区);但是hive中的partition的组织方式和数据库中的u不同,在hive中,表中的一个partition对应于表下的一个目录,所有partition的数据都存储在相对应的目录中;分区就分目录了;
Buckets对指定的列计算hash,根据hash值切分数据,目的是并行,每个bucket对应一个文件;External Table只想已经在HDFS中存在的数据;,可以创建partition,和它和table在元数据上的组织是相同的;实际数据存储相差较大;
Talbe的创建和加载过程实际数据会被移动到数据仓库的目录中;在数据仓库中完成;删除表,表中的数据和元数据都会消失,但external table删除时不会删除元数据;

解析hive用户提交hive语句,对其进行解析,分解为表 字段 分区等数据模型对象,根据解析的信息构建表,字段,分区等对象,将元数据通过DAO方法写入元数据表中,成功后将表信息的SEQUENCE_TABLE中对应的最新ID+5;

hive解释器
driver调用解释器处理hiveQL字串,这些字串可能是一条DDL,DML或查询语句;
编译器将字符串转化为策略(plan),策略仅由元数据操作和HDFS操作组长,元数据操作只包含DDL语句;
HDFS操作只包含Load语句,对于插入和查询而言,策略由MapReduce任务中具有方向的非循环图(DAG)组成;具体如下:
解析器(parser):将查询字串转换为解析树表达式;
语义分析器(semantic analyzer):将解析树表达式转换为基于块的内部查询表达式,将输入表的模式信息从metastore中进行恢复,用这些信息验证列名;展开select * 操作以及类型检查;
逻辑策略生成器(logical plan generator):将内部查询表达式转化为逻辑策略,这些策略由逻辑操作树组成;
优化器(optimaizer):通过逻辑策略构造多途径并以不同的方式进行重写,优化各种比如join,group by等的优化;

hive文件格式
支持四种文件格式:TextFile,SequenceFile,RCFile和i自定义;TextFile为默认格式,建表时不默认为这个格式,导入时直接将数据复制到HDFS中不进行处理;
SequenceFile和RCFile格式的表不能直接从本地文件中直接导入数据,数据要先导入TextFile表中,然后再从TextFile表中用insert导入到这两种类型的表;也就是说这两种类型不是基础类型,以块为基础;
当用户的数据文件格式不能被当前的hive所识别时,可以自定义文件格式,用户可以通过InputFormat和OutputFormat来自定义输入输出格式;
定义表时,用stored as textfile 来定义类型;
三种文件格式
textfile是默认格式,数据不进行压缩,磁盘开销大,数据解析开销大,可结合gzip,bzip2使用(系统自动检查,执行查询时自动解压)但使用这种发给你是,数据不会进行切分,从而无法对数据进行并行操作;
sequencefile是hadoopAPI中提供的一种二进制文件支持,其具有使用方便,可分割,可压缩的特点,支持三种压缩选择none,record,block;record压缩率低,一般使用block压缩;
RCfile文件格式是facebook开发的一个集行存储和列存储有点为一身,压缩比更高,读取列更快,在mapreduce中大规模数据处理扮演者重要角色;数据按行分块,避免读一个数据需要读取多个块;rcfile存储结构遵循先水平划分,再垂直划分的设计理念,首先保证同一行的数据在同一节点中也可以利用列维度进行数据压缩;压缩时每个行组元数据头部和表格数据段分别进行压缩;压缩重复长序列;数据追加是通过HDFS的追加文件尾的形式来进行追加;解压是只解压他使用的那一部分;
行组大小超过4MB,数据压缩比将趋近于一致;行组不能太大,太大虽然会减少表格的存储规模,但是会损害数据的可读性;
自定义数据格式
直接规定inputformat和outputformat来定义输入输出格式;
create table user(str string)
stored as  inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'
inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'

hive操作
类似于sql;
create table xxx(xxx 类型);创建表;
external 创建是的外部表,数据不会到数据仓库,但是得指定数据路径;
comment:字段的注释;
like复制表结构;
外部表,在创建表结构之前,数据已经保存在HDFS上,删除表的时候不会删除元数据;
注释直接在字段之后加上;
创建外部表,则直接创建的时候在上面加上external;
删除表drop table xxx;
修改表名alter table xxx rename to xxx;
创建相同表结构的表create table xxx like xxx;
查询
select * from xxx;是唯一一个不调用mapreduce而是直接执行的;
where
select xxx from xxx where xxx=xxx;
hive不支持where中的in和exist;
All默认查询所有,包括重复的,distinct则去掉重复项;
select all xxx from xxx;
select distinct xxx from xxx;

基于partition的查询
一般查询都会扫描所有的表,但是如果表在建立的时候使用了partitioned by字句建表的时候,,查询就可以利用分区剪枝的特性,只扫描他关心的那一部分;hive当前的实现是,只有分区断言出现在里from子句最近的那个where子句中时才u和i启用分区剪枝;就是指出发前面的那个where语句,而且这个语句还是分区使用的属性;
select aaa.xxx from aaa where aaa.xxx>='ddd" and aaa.xxx<'ddd';只执行前面那个aaa.xxx>='ddd';
hive不支持having;
limit限制查询记录数,结果随机
select xxx from xxxx limit 5; 限制五条记录;
正则表达式查询
可以用正则表达式做列选择;
select '(datetime|month)?+.+' from xxx; 除datetime和month之外的所有列;
group by分组查询
select xxx.xxx xxx(distinct xxx) from xxx group by xx;
order by 排序
order by 对输入做全局排序,需要较长的时间,所以需要使用hive.mapred.mode属性,hive.mapred.mode=strict;
默认为nostrict;
在strict下必须指定 limit;
sort by 不受hive.mapred.mode属性的限制,sort by的数据只能保证同一个reduce中的数据可以指定字段排序;
而且可以指定reduce的个数(set mapred.reduce.tasks=<number>);这样可以输出更多的数据,对其进行归并排序,可以得到全部结果;

distribute by 按照制定字段对数据划分到不同的输出reduce文件中
insert overwrite local directory '/home/hadoop/test.txt' select * from test order by name distribute by length(name);
cluster by查询除了具有distribute by的功能之外还兼具sort by的功能;
数据加载
load data local inpath '绝对路径' [overwrite] into table tablename;
load操作只是单纯的移动复制;
表插入
insert overwrite table xxx select * from xxx1;xxx1里的数据插入到xxx中;
多表插入
就是多个表插入,但是可以将from xx写在前面;
导入数据到本地 insert overwrite local directory '本地绝对路径' select * from xxx;
hdfs路径不需要加local;
视图操作
hive 0.6以上的版本才支持view,hive view具有以下特点:
view只是逻辑存在,hive 暂不支持物化视图;
view只读,不支持insert/alter/load/;
支持迭代视图;删除也都一样;

索引
ceate index xxx on table xx(xxx);
桶操作
需要设置环境变量set hive.enforce.bucketing=true;
复合类型
fields terminated by 字段分隔符;
collection items terminated by 一个字段各个item的分隔符;


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 熊猫兔感冒了一直打喷嚏怎么办 兔子后腿骨断了怎么办 兔子的腿肿了怎么办 仓鼠喝了牛奶该怎么办 宠物兔不吃不喝怎么办 兔子把木屑吃了怎么办? 小车司机碰瓷大车司机怎么办 在淘宝买到假的护肤品怎么办 淘宝购物发现是假的怎么办 电脑键盘灯不亮不能打字怎么办 海棠兔屁股有屎怎么办 大冒险告白被接受了怎么办剧透微博 大冒险被告白了怎么办 腐书网 大冒险告白被接受了怎么办 006 大冒险告白被接受了怎么办广播剧 coolpad手机解锁图案忘了怎么办 装死兔严重掉毛怎么办 兔子嘴巴磕破了怎么办 嘴巴里面摔烂了怎么办 兔子的鼻子损了怎么办 两个人嘴巴被粘牙糖粘住怎么办 小鸟被老鼠粘粘住了怎么办 小猫被老鼠粘粘住怎么办 羊子嘴巴烂了怎么办 小孩突然嘴肿了怎么办 电视机图像颜色变了 怎么办 冰沙床垫结块了怎么办 冰沙床垫融化了怎么办 脚真菌感染肿了怎么办 水雾魔珠被吃了怎么办 怀孕40天出血了怎么办 联璧金融里的钱怎么办 提现的钱不对怎么办 究极日月蛋太多怎么办 人脸识别不匹配怎么办 地下城没有属强怎么办 传奇属性点错了怎么办 龙之谷技能太多怎么办 龙之谷pk卡怎么办 为什么访问别人空间没有记录怎么办 被蚊孑咬了有小红包怎么办