Hive元数据

元数据:最本质、最抽象的定义:data about data(关于数据的数据)
hive元数据就是hive的一些基本的元素,主要包括hive表的基本属性
(1)hive表的数据库名、表名、字段名称与类型、分区字段与类型
(2)表的分区,分区的属性location等
(3)serdeproperties, tblproperties等等

读时模式与写时模式

读时模式:只有hive读的时候才会检查,解析字段和schema
优点:加载数据非常迅速,因为不需要解析数据
写时模式:写的慢,写的过程需要建立索引,压缩,验证数据一致性

HiveQL

语句转换:sql -> mapreduce
hive自身不会生成mapreduce,而是通过一个执行计划去执行mr(xml文件 -> mapper、reducer模块)

Hadoop读取文件数据方法:TextFile、SequenceFile、RCFile

SequenceFile:hadoop提供的一种二进制文件,<key,value>形式序列化到问价中,Java Writeable接口进行序列化和反序列化
RCFile:hive专门推出的一种面向列的数据格式

Hive支持的4个数据模型

数据表、分区表、分桶表、

内部表与外部表的区别

创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;创建外部表时,只记录数据所在的路径,不对数据的位置做任何改变
删除表时:再删除表时,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。相对来说,外部表更加安全些,数据组织也更加灵活,方便共享原数据。

分区表

可对数据按天数、移动端手机类型(iOS、Android)来分区,不可按照userid这种来分区,不然就是一个用户一个分区,产生了大量的小文件,namenode会产生大量的元数据存储内存消耗。

分桶表

Hive会针对某一列进行桶的组织,通常对列值做hash
这其实是把一张表变成多个表的过程(每个bucket里存的是具有相同userid的数据)
优点:优化查询、方便采样

order by

hive中的order by语句会对查询结果做一次全局排序,即,所有的mapper产生的结果都会交给一个Reduce处理,无论数据量大小,job任务只会启动一个Reduce,如果数据量巨大,则会耗费大量时间。
这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

sort by

hive中的sort by语句会在Reduce端对每一块局部数据进行局部排序,方便了接下来的局部排序

distribute by 与sort by 一起使用

ditribute by是控制map的输出在reducer是如何划分的,然后在指定的Reduce中进行sort by排序。distribute by 必须写在sort by之前

select mid, money, name from store distribute by mid sort by mid asc, money asc

cluster by

cluster by的功能就是distribute by和sort by相结合
cluster by 指定的列只能是降序的

字符串连接函数concat

语法: concat(string A, string B…)
说明:返回输入字符串连接后的结果,支持任意个输入字符串

hive常用函数链接

hive 行拆列之explode

explode(ARRAY) 列表中的每个元素生成一行
explode(MAP) map中每个key-value对,生成一行,key为一列,value为一列
explode将复杂结构一行拆成多行,然后再用lateral view做各种聚合