Hive疑难杂问

本文探讨了Hive在处理count(distinct)时的优化策略,指出增大Reduce Task数无效,建议转换为子查询分步处理。同时,对比了count(distinct)与group by count()在大数据量场景下的性能差异。还介绍了Hive语句运行机制,包括where、having、group by、order by的执行顺序,以及Hive的MetaStore三种模式。此外,文章还涉及了Hive的计算引擎选择,如MapReduce、Spark和Tez的优劣,并讨论了Hive、Hive on Spark与SparkSQL的区别,以及HQL与SQL的差异。最后,文章讨论了解决Hive小文件过多问题的方法和Hive事务及锁的概念。
摘要由CSDN通过智能技术生成

Hive优化count(distinct)

SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...;

由于引入了DISTINCT,因此在Map阶段无法利用combine对输出结果消重,必须将id作为Key输出,在Reduce阶段再对来自于不同Map Task、相同Key的结果进行消重,计入最终统计值。
  这个作业运行时的Reduce Task个数为1,对于统计大数据量时,这会导致最终Map的全部输出由单个的ReduceTask处理。这唯一的Reduce Task需要Shuffle大量的数据,并且进行排序聚合等处理,这使得它成为整个作业的IO和运算瓶颈。
  尝试通过显式地增大Reduce Task个数来提高Reduce阶段的并发。具体设置如下:

set mapred.reduce.tasks=100

但这一参数并没有影响实际Reduce Task个数,Hive运行时输出“Number of reduce tasks determined at compile time: 1”。因为Hive在处理COUNT这种“全聚合(full aggregates)”计算时,它会忽略用户指定的Reduce Task数,而强制使用1。
  解决方案:转换为子查询,转化为两个MapReduce任务,先select distinct的字段,然后在count(),这样去重就会分发到不同的reduce块,count依旧是一个reduce但是只需要计数即可。

SELECT COUNT(*) FROM (SELECT DISTINCT id FROM TABLE_NAME WHERE) t;

补充:count(distinct user_id)count...group by user_id的区别?
  首先要清楚count(distinct) 的原理机制,它是将数据通过map端发往一个reduce,之后reduce接收到数据之后,会将数据放入到hashset中去重,之后cleanUp()方法再执行最后的逻辑,比如:计算hashset的size等。这里就出现了一些问题:
1)数据都发往一个reduce会造成数据倾斜
2)程序从分布式变成单机程序,影响效率
3)程序执行过程中,只产生一个job
  但也不是绝对的,当数据量很小的时候,此时我们并不需要采分布式执行,一个job运行足矣。但是,当数据量比较大的时候,这时count(distinct) 就暴露除了大大的弊端,所以,此时,不应该采用此法来实现去重。count()…group() by当数据量比较大的时候,采用此法,先分组,这时已经在map端实现了去重机制,之后数据发往reduce 数据量已经变得很小了,并且此法涉及到shuffle ,所以reduce的压力不会集中在某个上,并且会产生多个job 。

group() by count() 一定比count(distinct) 性能要好吗?
  不一定,当数据量比较大的时候采用group() by count() 会比count(distinct) 要好,但是在数据量比较小的时候,一个 job就可以处理,没必要用两个job ,也没必要shuffle,所以调优看情况而定。

Hive语句的运行机制包含where、having、group by、order by,执行过程顺序

1.where xx对全表数据做筛选
2.针对结果集使用group by分组
3.针对每个分组进行select查询,有几组就执行几次
4.再进行having筛选每组数据
5.最后整体进行order by排序

补充:Hive语句在MapReduce是怎么运行的,Map端输出的key-value值具体是什么?类似wordcount,MapReduce的输入输出对应什么?(把MR中的分组,排序说一下,要对MR中map(),reduce()和shuffle熟悉)

Hive的MetaStore的三种模式

  1. 内嵌Derby方式
      这个是Hive默认的启动模式,一般用于单元测试,这种存储方式有一个缺点:在同一时间只能有一个进程连接使用数据库
  2. Local方式
      例如本地MySQLÿ
回答: 在Hive面试中,常常会问到一些和函数相关的问题。以下是一些常见的Hive函数相关的问题: 1. 请简单介绍下Hive架构? Hive架构包括Hive客户端、Hive驱动程序、Hive服务、Hive元数据存储和Hive数据存储。Hive客户端用于与用户交互,Hive驱动程序负责解析和执行HiveQL查询,Hive服务提供了与Hive客户端和Hive驱动程序的通信接口,Hive元数据存储用于存储表、分区、列等元数据信息,Hive数据存储用于存储实际的数据。 2. Hive表有哪些类型及其区别? Hive表有内部表和外部表两种类型。内部表的数据存储在Hive数据存储中,当删除表时,数据也会被删除。外部表的数据存储在外部文件系统中,当删除表时,数据不会被删除。 3. Hive创建表有哪些方式? Hive创建表的方式有两种:使用HiveQL语句创建表和使用Hive元数据存储中的表定义创建表。 4. Hive排序Order By、Distrbute By、Sort By及Cluster By区别? Order By用于对查询结果进行全局排序,Distribute By用于指定数据的分发方式,Sort By用于对每个Reducer的输出进行排序,Cluster By是Sort By和Distribute By的结合,既指定了数据的分发方式,又对每个Reducer的输出进行排序。 5. RANK、DENSE_RANK及ROW_NUMBER的区别? RANK、DENSE_RANK和ROW_NUMBER都是用于对查询结果进行排序并分配排名。RANK会跳过相同的排名,DENSE_RANK不会跳过相同的排名,ROW_NUMBER会为每一行分配唯一的排名。 6. Hive中你使用过哪些内置函数? Hive中有很多内置函数,常见的包括字符串函数、数学函数、日期函数、聚合函数等。 7. Hive中有哪些数据文件格式? Hive中常用的数据文件格式有文本文件格式、序列文件格式、Parquet文件格式、ORC文件格式等。 8. udf、udaf及udtf区别?你有没有用过自定义函数? UDF是用户自定义函数,用于处理单个输入行并返回一个输出值;UDAF是用户自定义聚合函数,用于处理多个输入行并返回一个聚合结果;UDTF是用户自定义表生成函数,用于处理单个输入行并生成多个输出行。我有使用过自定义函数。 希望以上回答对您有所帮助。 #### 引用[.reference_title] - *1* *3* [Hive常见高频面试题(上篇)](https://blog.csdn.net/weixin_44868723/article/details/124393542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Hive常见面试题汇总](https://blog.csdn.net/weixin_45675924/article/details/118707219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值