什么是Hive?
Hive 是基于Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL 查询功能。
本质是:将HQL 转化成MapReduce 程序
简述Hive主要架构及解析成MR的过程
元数据,经过Driver内的解析器,编译器,优化器,执行器转换成mapreduce,提交给hadoop中执行,最后将执行返回的结果输出到用户交互接口
- 1)Hive 处理的数据存储在HDFS
- 2)Hive 分析数据底层的实现是MapReduce
- 3)执行程序运行在Yarn 上
谈一下hive的特点,以及hive和RDBMS有什么异同
1.存储位置:Hive在Hadoop(HDFS)上;Mysql将数据存储在设备或本地系统中
2.数据更新:Hive不支持数据的改写和添加(比较少),更多的是用于查询;数据库可以增删改查
3.索引:Hive中没有索引(因为不需要对数据做任何处理),Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。但由于Mapreducer的引入,Hive可以并行访问数据,因此即使没有索引,一样可以体现优势。
数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟
4.延迟性:除去没有索引,暴力扫描外,MapReduce本身就具有很高的延迟,相对的数据库延迟较小,当然这个低是有条件的,当数据规模的超过数据库的处理能力时,hive的并行计算就可以体现出优势。
说一下hive中sort by、order by、cluster by、distribute by各代表的意思
Hive内部表和外部表的区别
存储:外部表数据由HDFS管理;内部表数据由hive自身管理
存储位置:外部表数据存储位置由自己指定(没有指定location则在默认地址下新建);内部表数据存储在hive.metastore.warehouse.dir (默认在/uer/hive/warehouse)
删除(操作权限):删除外部表仅仅删除元数据;删除内部表会删除元数据和存储数据
分区表和分桶表的区别?
分区针对的是数据的存储路径;分桶针对的是数据文件
分区表:Hive 数据表可以根据某些字段进行分区操作,细化数据管理,让部分查询更快,不同分区对应不同的目录;
分桶表:表和分区也可以进一步被划分为桶,分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,不同的桶对应不同的文件
简要描述数据库中的 null,说出null在hive底层如何存储
null与任何值运算的结果都是null,可以使用is null、is not null函数指定其值为null情况下的取值
写出hive中split、coalesce及collect_list函数的用法
split将字符串转化为数组,即:split('a,b,c,d' , ',') ==> ["a","b","c","d"]。
coalesce(T v1, T v2, …) 返回参数中的第一个非空值;如果所有值都为 NULL,那么返回NULL。
collect_list列出该字段所有的值,不去重 select collect_list(id) from table
.写出将 text.txt 文件放入 hive 中 test 表‘2016-10-10’ 分区的语句,test 的分区字段是 l_date
load data local inpath '/your/path/test.txt' overwrite into table test partition(1_date='2016-10-10')
Hive join过程中大表小表的放置顺序
在编写带有join操作的代码语句时,应该将小表(条目少)放在join操作符的左边。因为在reduce阶段,位于join操作符左边的表的内容会被加载进内存,载入条目较少的表可以有效减少oom(out of memory)即内存溢出。所以对于同一个key来说,对应的value值小的放前,大的放后。
大表与大表的关联
如果两张都是大表,那么采用联合key,联合key的第一个组成部分是join on中的公共字段,第二部分是一个flag,0代表表A,1代表表B,由此让Reduce区分客户信息和订单信息;在Mapper中同时处理两张表的信息,将join on公共字段相同的数据划分到同一个分区中,进而传递到一个Reduce中,然后在Reduce中实现聚合(有待提高,看不懂)