大数据开发之路:hive篇,你看了吗?
功效如下图所示: 此时,假如要去top1的数据,只需添加rank为1的前提即可。和row_number成果和用法相同的函数尚有rank()和dense_rank(),独一的区别在返回的排序rank值有渺小区别,此处不再赘述。 Hive进阶 数据倾斜 在我们数据洗濯进程中,常常会呈现一种征象,漫衍式使命一样平常会分成多个小使命task,可是呢,有些task处理赏罚的很快,有些task就很慢,偶然辰乃至会卡死导致整个使命失败,这种征象就是恶名远扬的数据倾斜。之以是导致数据倾斜,大部门是join、去重统计(count distinct)可能group by操纵中的key漫衍不匀称。拿最常见的hive查询引擎mapreduce来说,根基就是shuffle阶段,有些reduce使命获取到的key数据量异常多,导致处理赏罚很迟钝。 为了停止数据倾斜,一样平常从两种偏向去办理: 1.调解hive参数 我们可以配置hive.map.aggr和hive.groupby.skewindata两个参数为true,此时hive会天生两个job使命,第一个job先将key举办随机化处理赏罚,第二个job在举办真正的shuffle key。如下贱程声名图: 从上图可以看出,因为多次在map端聚合,使得最终shuffle时的数据量大大镌汰,从而减轻了数据倾斜的水平。 2.优化sql 行使mapJoin:我们常常会有巨细表join的需求,而这也是数据倾斜的多发区。此时我们可以行使mapJoin的方法,从而停止shuffle。详细实现就是把小表在每一个Map使命内存中生涯一份,从而直接在Map就举办join操纵。没了reduce进程,天然也停止了数据倾斜。在hive0.11版本之前,必要表现声明启动该优化操纵,如下示例SQL所示:Select /+ MAPJOIN(small_tab)/ .key,value FROM small_tab JOIN big_tab ON small_tab.key = big_tab.key 而在hive0.11版本之后,hive可以或许自动检测小表,自行举办mapJoin优化。我们可以通过hive.mapjoin.smalltable.filesize参数手动设置小表的阈值(默认值25M)。行使MapJoin有一个弱点在于内存会挥霍,由于每个Map端都有一个副本。以是mapJoin也一样平常只得当巨细表join的环境。 非常值、非凡值手动处理赏罚:许多时辰造成数据倾斜的也许是一些空值可能,字符串导致的。我们可以通过过滤空值可能对空值做随机字符串处理赏罚,由此停止空值的影响。 假如是大表和大表的join发生了数据倾斜,mapJoin这种方法不太吻合,可是在某些场景下,个中一个大表可以被处理赏罚成小表。好比,我们要查询单日访客赏识记录,并必要附加用户信息。这时辰要和用户大表user_info关联,而单日访客记录量user_flow也较量大,并不能直接行使mapjoin的方法。但细心说明,单日访客UV着实并不大,可以先举办简朴去重,转换为小表进而可以行使mapJoin。 详细SQL如下所示:
上风和不敷 Hive今朝作为业内行使最为普及的数据客栈器材,天然有着许多利益: 高靠得住、容错性高、扩展性强。 HQL语法和传统SQL相同,且内置大量处理赏罚函数支持的存储名目种类多,兼容性强。用户接口多,支持各类情势的挪用。可是hive也有它自身的一些不敷,好比: OLTP支持不敷,不支持事宜,今朝只有较量新的版本才可以实现队列级别更新且对名目要求严酷。 因为HDFS特征数据处理赏罚耽误高服从较低。HQL的表达手段和机动性方面有限。基于这些优弱点,hive有它自身善于的规模,好比用作离线数据客栈,批量处理赏罚海量数据。假如要追求及时性可能要高服从处理赏罚小量数据,今朝来看,其他新的技能方案,好比kudu、hbase等或者是更好的选择。
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |