大数据 Hive - 实现SQL执行

这篇具有很好参考价值的文章主要介绍了大数据 Hive - 实现SQL执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


MapReduce的出现大大简化了大数据编程的难度,使得大数据计算不再是高不可攀的技术圣殿,普通工程师也能使用MapReduce开发大数据程序。

但是对于经常需要进行大数据计算的人,比如从事研究商业智能(BI)的数据分析师来说,他们通常使用SQL进行大数据分析和统计,MapReduce编程还是有一定的门槛。

而且如果每次统计和分析都开发相应的MapReduce程序,成本也确实太高了。那么有没有更简单的办法,可以直接将SQL运行在大数据平台上呢?

一项技术如果不能普及大多数人就不能真正地投入使用,这业务Hive出现的必要原因。

MapReduce实现SQL的原理

SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;

这是一条很普通的sql,统计不同年龄的用户访问不同网页的兴趣偏好,对于产品运营和设计很有价值。

大数据 Hive - 实现SQL执行,大数据,大数据,hive,sql
左边是要分析的数据表,右边是分析结果。实际上把左边表相同的行进行累计求和,就得到右边的表了,看起来跟WordCount的计算很相似。确实也是这样,我们看下这条SQL语句的MapReduce的计算过程,按照MapReduce编程模型,map和reduce函数的输入输出以及函数处理过程分别是什么。

首先,看下map函数的输入Key和Value,我们主要看Value。Value就是左边表中每一行的数据,比如<1, 25>这样。map函数的输出就是以输入的Value作为Key,Value统一设为1,比如<<1, 25>, 1>这样。

map函数的输出经过shuffle以后,相同的Key及其对应的Value被放在一起组成一个,作为输入交给reduce函数处理。比如<<2, 25>, 1>被map函数输出两次,那么到了reduce这里,就变成输入<<2, 25>, <1, 1>>,这里的Key是<2, 25>,Value集合是<1, 1>。

在reduce函数内部,Value集合里所有的数字被相加,然后输出。所以reduce的输出就是<<2, 25>, 2>。

讲起来有点拗口,我把这个过程画成了一张图,看起来就清楚多了。

大数据 Hive - 实现SQL执行,大数据,大数据,hive,sql
这样一条很有实用价值的SQL就被很简单的MapReduce计算过程处理好了

在数据仓库中,SQL是最常用的分析工具,既然一条SQL可以通过MapReduce程序实现,那么有没有工具能够自动将SQL生成MapReduce代码呢?这样数据分析师只要输入SQL,就可以自动生成MapReduce可执行的代码,然后提交Hadoop执行,也就完美解决了我们最开始提出的问题。问题的答案,也就是这个神奇的工具就是Hadoop大数据仓库Hive。

Hive的架构

Hive能够直接处理我们输入的SQL语句(Hive的SQL语法和数据库标准SQL略有不同),调用MapReduce计算框架完成数据分析操作。下面是它的架构图,我们结合架构图来看看Hive是如何实现将SQL生成MapReduce可执行代码的。

大数据 Hive - 实现SQL执行,大数据,大数据,hive,sql
我们通过Hive的Client(Hive的命令行工具,JDBC等)向Hive提交SQL命令。如果是创建数据表的DDL(数据定义语言),Hive就会通过执行引擎Driver将数据表的信息记录在Metastore元数据组件中,这个组件通常用一个关系数据库实现,记录表名、字段名、字段类型、关联HDFS文件路径等这些数据库的Meta信息(元信息)。

如果我们提交的是查询分析数据的DQL(数据查询语句),Driver就会将该语句提交给自己的编译器Compiler进行语法分析、语法解析、语法优化等一系列操作,最后生成一个MapReduce执行计划。然后根据执行计划生成一个MapReduce的作业,提交给Hadoop MapReduce计算框架处理。

对于一个较简单的SQL命令,比如:

SELECT * FROM status_updates WHERE status LIKE ‘michael jackson’;

它对应的Hive执行计划如下图。

大数据 Hive - 实现SQL执行,大数据,大数据,hive,sql
Hive内部预置了很多函数,Hive的执行计划就是根据SQL语句生成这些函数的DAG(有向无环图),然后封装进MapReduce的map和reduce函数中。这个例子中,map函数调用了三个Hive内置函数TableScanOperator、FilterOperator、FileOutputOperator,就完成了map计算,而且无需reduce函数。

Hive如何实现join操作

除了上面这些简单的聚合(group by)、过滤(where)操作,Hive还能执行连接(join on)操作。文章开头的例子中,pv_users表的数据在实际中是无法直接得到的,因为pageid数据来自用户访问日志,每个用户进行一次页面浏览,就会生成一条访问记录,保存在page_view表中。而age年龄信息则记录在用户表user中。

大数据 Hive - 实现SQL执行,大数据,大数据,hive,sql
这两张表都有一个相同的字段userid,根据这个字段可以将两张表连接起来,生成前面例子的pv_users表,SQL命令是

SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);

同样,这个SQL命令也可以转化为MapReduce计算,连接的过程如下图所示。

大数据 Hive - 实现SQL执行,大数据,大数据,hive,sql

从图上看,join的MapReduce计算过程和前面的group by稍有不同,因为join涉及两张表,来自两个文件(夹),所以需要在map输出的时候进行标记,比如来自第一张表的输出Value就记录为<1, X>,这里的1表示数据来自第一张表。这样经过shuffle以后,相同的Key被输入到同一个reduce函数,就可以根据表的标记对Value数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出就是join的结果。

所以我们如果打开Hive的源代码,看join相关的代码,会看到一个两层for循环,对来自两张表的记录进行连接操作。

小结

在实践中,工程师其实并不需要经常编写MapReduce程序,因为网站最主要的大数据处理就是SQL分析,也因此Hive在大数据应用中的作用非常重要。

后面随着Hive的普及,我们对于在Hadoop上执行SQL的需求越加强烈,对大数据SQL的应用场景也多样化起来,于是又开发了各种大数据SQL引擎。

Cloudera开发了Impala,这是一种运行在HDFS上的MPP架构的SQL引擎。和MapReduce启动Map和Reduce两种执行进程,将计算过程分成两个阶段进行计算不同,Impala在所有DataNode服务器上部署相同的Impalad进程,多个Impalad进程相互协作,共同完成SQL计算。在一些统计场景中,Impala可以做到毫秒级的计算速度。

后来Spark出道以后,也迅速推出了自己的SQL引擎Shark,也就是后来的Spark SQL,将SQL语句解析成Spark的执行计划,在Spark上执行。由于Spark比MapReduce快很多,Spark SQL也相应比Hive快很多,并且随着Spark的普及,Spark SQL也逐渐被人们接受。后来Hive推出了Hive on Spark,将Hive的执行计划转换成Spark的计算模型,当然这是后话了。

此外,我们还希望在NoSQL的数据库上执行SQL,毕竟SQL发展了几十年,积累了庞大的用户群体,很多人习惯了用SQL解决问题。于是Saleforce推出了Phoenix,一个执行在HBase上的SQL引擎。

这些SQL引擎基本上都只支持类SQL语法,并不能像数据库那样支持标准SQL,特别是数据仓库领域几乎必然会用到嵌套查询SQL,也就是在where条件里面嵌套select子查询,但是几乎所有的大数据SQL引擎都不支持。然而习惯于传统数据库的使用者希望大数据也能支持标准SQL,我当时在Intel的大数据团队就决定开发一款可以支持标准SQL的大数据引擎,我作为最主要的开发者参与其中。江湖传说,开发数据库、编译器、操作系统是程序员的三大梦想。我将在专栏里专门讲述如何设计、开发一个大数据SQL引擎,一起感受开发数据库是怎样一种体验。

最后我们还是回到Hive。Hive本身的技术架构其实并没有什么创新,数据库相关的技术和架构已经非常成熟,只要将这些技术架构应用到MapReduce上就得到了Hadoop大数据仓库Hive。但是想到将两种技术嫁接到一起,却是极具创新性的,通过嫁接产生出的Hive可以极大降低大数据的应用门槛,也使Hadoop大数据技术得到大规模普及。

在我们工作中也可以借鉴一下这种将两种技术嫁接到一起产生极大应用创新性的手段,说不定下一个做出类似Hive这种具有巨大应用价值技术产品的就是你。文章来源地址https://www.toymoban.com/news/detail-783341.html

到了这里,关于大数据 Hive - 实现SQL执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【大数据】Hive SQL语言(学习笔记)

    1)数据库结构 默认的数据库叫做default,存储于HDFS的:/user/hive/warehouse 用户自己创建的数据库存储位置:/user/hive/warehouse/database_name.db 2)创建数据库 comment:数据库的注释说明语句 location:指定数据库在HDFS存储位置,默认/user/hive/warehouse/dbname.db with dbproperties:用于指定一些数

    2024年02月07日
    浏览(33)
  • 3.Hive SQL数据定义语言(DDL)

    1.1 常见的开发方式 (1) Hive CLI、Beeline CLI Hive自带的命令行客户端 优点:不需要额外安装 缺点:编写SQL环境恶劣,无有效提示,无语法高亮,误操作率高 (2) 文本编辑器 Sublime、Emacs、EditPlus等 有些不支持作为客户端连接Hive服务,但支持SQL语法环境,那就在编辑器中开发

    2024年02月12日
    浏览(38)
  • 大数据技术之Hive SQL题库-中级

    1)表结构 user_id(用户id) gender(性别) birthday(生日) 101 男 1990-01-01 102 女 1991-02-01 103 女 1992-03-01 104 男 1993-04-01 2)建表语句 hive 3)数据装载 hive 1)表结构 sku_id (商品id) name (商品名称) category_id (分类id) from_date (上架日期) price (商品价格) 1 xiaomi 10 1 2020-01-01 2000 6 洗碗机 2 2020-02-01

    2024年02月11日
    浏览(39)
  • Spark SQL数据源:Hive表

    Spark SQL还支持读取和写入存储在Apache Hive中的数据。然而,由于Hive有大量依赖项,这些依赖项不包括在默认的Spark发行版中,如果在classpath上配置了这些Hive依赖项,Spark就会自动加载它们。需要注意的是,这些Hive依赖项必须出现在所有Worker节点上,因为它们需要访问Hive序列化

    2024年02月11日
    浏览(28)
  • HIVE SQL实现分组字符串拼接concat

    在Mysql中可以通过 group_concat() 函数实现分组字符串拼接,在HIVE SQL中可以使用 concat_ws()+collect_set()/collect_list() 函数实现相同的效果。 实例: a b c 2014 B 9 2015 A 8 2014 A 10 2015 B 7 2014 B 6 1.concat_ws+collect_list 非去重拼接 查询结果: a col_b col_c 2014 B-A-B 9-10-6 2015 A-B 8-7 2.concat_ws+collect_se

    2024年02月12日
    浏览(32)
  • 三种SQL实现聚合字段合并(presto、hive、mysql)

    需求:按照项目名,以逗号合并参与人

    2024年02月16日
    浏览(33)
  • HIVE SQL通过Lateral View + explode实现列转行

    原表: a b Andy 碟中谍,谍影重重,007 MOMO 小鞋子,朋友啊你的家在哪里 David ‘’ Lily NULL 实现效果 a b Andy 碟中谍 Andy 谍影重重 Andy 007 MOMO 小鞋子 MOMO 朋友啊你的家在哪里 David ‘’ 实现代码: 注: explode函数:处理map结构的字段,将数组转换成多行,所以此处使用了split函数将

    2024年02月12日
    浏览(25)
  • 爱奇艺大数据加速:从Hive到Spark SQL

    01 爱奇艺自2012年开展大数据业务以来,基于大数据开源生态服务建设了一系列平台,涵盖了数据采集、数据处理、数据分析、数据应用等整个大数据流程,为公司的运营决策和各种数据智能业务提供了强有力的支持。随着数据规模的不断增长和计算复杂度的增加,如何快速挖

    2024年02月08日
    浏览(30)
  • HIVE SQL 根据主键去重并实现其余字段分组聚合

    相同个人id下所有字段按时间顺序补位,取首个不为空值 * 注意:此处是取的首个不为空(即不为null)的字段,所以在实际使用过程中应提前将空字符串转为null值。

    2024年02月16日
    浏览(31)
  • Hive命令行运行SQL将数据保存到本地如何去除日志信息

    先有需求需要查询hive数仓数据并将结果保存到本地,但是在操作过程中总会有日志信息和表头信息一起保存到本地,不符合业务需要,那如何才能解决该问题呢? 废话不多少,直接上代码介绍:

    2024年01月17日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包