HIVE面试问题
什么是hive:
- hive是基于Hadoop的一个数据仓库工具,可将HDFS上一个结构化的数据文件映射为数据表,方便进行管理。 HIVE也可以使用完整的SQL语句进行查询,是把SQL语句转换为MapReduce任务在hadoop运行,写SQL比写MapReduce任务学习成本低很多。
hive内部表和外部表的区别:
- 未被external修饰的是内部表,被external修饰的为外部表。 区别: 内部表数据由Hive自身管理,外部表数据由HDFS管理,存储位置由自己指定; 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
hive存储格式:
- STORED AS TEXTFILE; --存储的数据是文本,可以直接读取
- STORED AS ORC;–存储的数据是二进制,不可以直接读取
- STORED AS PARQUET;–存储的数据是二进制,不可以直接读取
hiveHIVE小文件过多处理:
- 1)使用hive自带的concatenate命令,自动合并小文件,但只能处理ORC,sql: alter table A concatenate;
- 2)调整参数减少MAP数量
- 3)调整参数减少REDUCE数量
- 4)使用hadoop的archive将小文件归档,但归档后不能直接insert
- 5)如果一次性解决一张历史性遗留问题表,建议备份数据重建表,或者insert overwrite
- 6)减少使用动态分区的使用,动态分区会产生大量的小文件。
Hive的两张表关联,使用MapReduce怎么实现?
- 首先在MAP端读取源表的数据,Map输出时候以Join on条件中的列为key,如果Join有多个关联键,则以这些关联键的组合作为key; Map输出的value为join之后所关心的(select或者where中需要用到的)列;同时在value中还会包含表的Tag信息,用于标明此value对应哪个表; 按照key进行排序,接着根据key的值进行hash,并将key/value按照hash值推送至不同的reduce中,这样确保两个表中相同的key位于同一个reduce中 ,最后根据key的值完成join操作,期间通过Tag来识别不同表中的数据。
HIVE特点(HIVE和RDBMS有何异同)
- 1)Hive不支持实时查询,适合离线批量数据处理。
- 2)延迟性比较高,适合对实时性不高的应用场景,比如数仓、大数据分析
- 3)HIVE适合数据量大的场景,商业数据库数据量大会非常影响效率。
- 4)HIVE不支持事物,比如关系型数据库里的各种锁,并不适合单条数据修改的场景。
- 5)HIVE支持修改数据的存储格式,比如TXTFILE,ORC,PARQUET,或者修改压缩格式,在关系型数据库里就没有这些选项。
什么是主数据、元数据
- 主数据:实际业务数据
- 元数据:描述数据的数据,对数据及信息资源的描述性信息,大部分属性字段就是元数据
数据排序 row_number(),rank()和dense_rank()的区别:
- row_number() 按顺序生成唯一值,排序相同时序号唯一
- rank() 排序相同时序号相同,总序号数不变
- dense_rank() 排序相同时序号相同,总序号数减少
Hive有索引吗
- Hive支持索引(3.0版本之前),但是Hive的索引与关系型数据库中的索引并不相同。并且 Hive索引提供的功能很有限,效率也并不高,因此Hive索引很少使用。
- 索引适用的场景:适用于不更新的静态字段。以免总是重建索引数据。每次建立、更新数据后,都要重建索引以构建索引表。
sort by 和 order by 的区别
- order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
- sort by不是全局排序,其在数据进入reducer前完成排序. 因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1, 则sort by只保证每个reducer的输出有序,不保证全局有序。
请说明hive中 Sort By,Order By,Cluster By,Distrbute By各代表什么意思?
- Order by:会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
- Sort by:不是全局排序,其在数据进入reducer前完成排序。1
- Distribute by:按照指定的字段对数据进行划分输出到不同的reduce中。
- Cluster by:除了具有 distribute by 的功能外还兼具 sort by 的功能。
开窗函数使用
- 聚合开窗函数:sum() --求和开窗
- 排名开窗函数:row_number()、rank()、dense_rank() --排名开窗
- 格式是开窗函数+over()语法,内含分组、排序、窗口范围等,如:row_number over(partition by 分组字段 order by 排序字段 asc|desc rows between 开始位置 and 结束位置)
- 常使用的窗口范围是rows between unbounded preceding and current row,表示从起点到当前行,常用该窗口来计算累加
- 求和开窗: select name,orderdate,cost, sum(cost) over() as sp1, --所有行相加 sum(cost) over(partition by name) as sp2, --按名字分组,组内相加 sum(cost) over(partition by name order by orderdate) as sp3, --按名字分组并按时间排序 查看顾客上次和下次的购买时间 select name,orderdate,cost, lag(orderdate,1) over(distribute by name sort by orderdate)as sp1,–上次购买时间 lead(orderdate,1) over(distribute by name sort by orderdate)as sp2–下次购买时间 from business; LAG(col,n): 往前第 n 行数据 LEAD(col,n):往后第 n 行数据
Hive的函数:UDF、UDAF、UDTF的区别?
- UDF:单行进入,单行输出
- UDAF:多行进入,单行输出
- UDTF:单行输入,多行输出
所有的Hive任务都会有MapReduce的执行吗?
- 不是,从Hive0.10.0版本开始,对于简单的不需要聚合的类似SELECT from LIMIT n语句,不需要起MapReduce job,直接通过Fetch task获取数据。
本文转载自: https://blog.csdn.net/weixin_44741666/article/details/136698868
版权归原作者 名字可以这么长 所有, 如有侵权,请联系我们删除。
版权归原作者 名字可以这么长 所有, 如有侵权,请联系我们删除。