`

Hive的基本原理与使用

 
阅读更多

本文转自:http://tiechou.info/?p=33

简介

Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据。Hive可以将结构化的数据存储在数据仓库中,通过自己的SQL去查询分析需要的内容,这套SQL简称Hive SQL。它与关系型数据库的SQL略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。

Hive在Hadoop的架构体系中承担了一个SQL解析的过程,它提供了对外的入口来获取用户的指令然后对指令进行分析,解析出一个MapReduce程序组成可执行计划,并按照该计划生成对应的MapReduce任务提交给Hadoop集群处理,获取最终的结果。
安装

Hive需要Hadoop的支持,也就是说在安装Hive之前需要正确安装Hadoop。一般我们会将Hive安装到NameNode所在主机上,这里假设使用root用户进行安装,Hive的安装过程很简单,网上有很多安装方式:

1 [root@192.168.1.111] # 去到hadoop的目录,使用hadoop的项目根目录
2 [root@192.168.1.111] cd /opt/hadoop
3 [root@192.168.1.111] # 下载项目包(去官网(http://hadoop.apache.org/)下载Hadoop项目)
5 [root@192.168.1.111] # 解压
6 [root@192.168.1.111] tar xzvf hive-0.5.0-dev.tar.gz
7 [root@192.168.1.111] # 进入目录
8 [root@192.168.1.111] cd hive-0.5.0-dev
9 [root@192.168.1.111] # 与Hadoop的安装一样,我们应该习惯性的将安装目录写入环境变量
10 [root@192.168.1.111] export HIVE_HOME=`pwd`
11 [root@192.168.1.111] # 也可以将环境变量设置到/etc/profile中


配置

Hive的必要配置相当简单,只需要声明$HADOOP_HOME(请查阅《Hadoop安装》文档)这个环境变量就行了。

Hive的核心配置文件$HIVE_HOME/conf/hive-default.xml中有一些对Hive关键配置,一般我们不需要对期进行改动,如果你需要更改这个关键配置,请不要直接更改hive-default.xml这个文件,在同一目录下新建hive-site.xml文件,然后将需要更改的属性配置在这里面即可,配置格式与hive-default.xml一样。

在Hive官方文档中重点提到了Hive的日志配置$HIVE_HOME/conf/hive-log4j.properties,虽然不是必要更改的配置文件,但合理的设置会对我们有一定的帮助,具体配置方法可见官方文档。


使用

Hive提供了一个CLI(Command Line Interface)客户端,我们可以通过CLI进行直观的DDL、DML及SQL操作。以下是CLI使用示例:

1 # 这里创建了一个foo表,字段以\001分隔,location指定映射文件位置
2 create external table foo
3 (
4 uid bigint,
5 brand_value string
6 )
7 row format delimited fields terminated by '\001'
8 stored as textfile
9 location "/group/tbsc-dev/haowen/temp/shpsrch_bshop_brand_value_ssmerge_1011/";
10   
11 # 插入数据到 foo表 注意这些语句不要用tab缩进
12 INSERT OVERWRITE TABLE foo
13 select uid,value_data
14 from
15 (
16   select t1.uid,t2.value_data
17   from
18      shpsrch_bshop_brand_unfold_ssmerge_1011 t1
19      join sel_shpsrch__base_values t2
20      on t1.brand_id = t2.value_id and t2.ds=20101019
21 ) a;

也可以在终端界面这样使用

1 echo "select * from foo where uid=153702175;" | hive -u root -p root


数据join

之前在数据join的时候遇到过这样一个问题,就是当一个uid 对应多个品牌brand_id 的时候,即:
uid – brand_id1 = brand_id1 – brand_value1
uid – brand_id2 = :
uid – brand_id3 = :
这样join之后的数据会出现:
uid – brand_value1
uid – brand_value1
这个样子相同的多条记录,出现数据重复的现象
如果数据量小的话,最简单的调试办法是 这样:把所有的数据放在一个namenode上面跑

1 hive -u root -p root  <<EOF
2   
3 # 指定reduced的任务数量
4 set mapred.reduce.tasks=1;
5 add file /data/tiechou/ssmerge/mod/mod_bshop_brand/script/brand_packed.pl;
6 explain
7 INSERT OVERWRITE TABLE foo
8   select transform(uid, value_data)
9   using 'brand_packed.pl'
10   as uid,brand_value
11   from
12 (
13 select t1.uid,t2.value_data
14   from
15      shpsrch_bshop_brand_unfold_ssmerge_1011 t1
16      join sel_shpsrch__base_values t2
17      on t1.brand_id = t2.value_id and t2.ds=1 distribute by t1.uid
18 ) a;
19 set mapred.reduce.tasks=256;
20 EOF

上面显然不是最好的办法,不过已经说明问题了,是相同uid被分到多个namenode上join引起的,其实hive是支持clusterBy? | distributeBy? sortBy? 的, clusterBy是 distributeBy? sortBy?的综合

1 hive -u root -p root  <<EOF
2   
3 add file /data/tiechou/ssmerge/mod/mod_bshop_brand/script/brand_packed.pl;
4 INSERT OVERWRITE TABLE foo
5 select transform(t3.uid,t3.value_data)
6   using 'brand_packed.pl'
7   as uid,brand_value
8 from(
9 from shpsrch_bshop_brand_unfold_ssmerge_1011 t1 join sel_shpsrch__base_values t2 on (t1.brand_id = t2.value_id and t2.ds=20101019) select t1.uid,t2.value_data distribute by t1.uid) t3;

最后我们普及一下sql join,在网上找了一个很形象的说明:http://coolshell.cn/articles/3463.html

SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join。


假设我们有两张表。

Table A 是左边的表。

Table B 是右边的表。


其各有四条记录,其中有两条记录是相同的,如下所示:


id name id name

– —- — —-
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja


下面让我们来看看不同的Join会产生什么样的结果。

1 SELECT * FROM TableA
2 INNER JOIN TableB
3 ON TableA.name = TableB.name


Inner join

id name id name
– —- — —-
1 Pirate 2 Pirate
3 Ninja 4 Ninja
结果集: 是A和B的交集。


Full outer join

1 SELECT * FROM TableA
2 FULL OUTER JOIN TableB
3 ON TableA.name = TableB.name


id name id name
– —- — —-
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader


结果集: 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。


Left outer join

1 SELECT * FROM TableA
2 LEFT OUTER JOIN TableB
3 ON TableA.name = TableB.name


id name id name
– —- — —-
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null


Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

1 SELECT * FROM TableA
2 LEFT OUTER JOIN TableB
3 ON TableA.name = TableB.name
4 WHERE TableB.id IS null


hive 中实现方式

1 select a_id from (
2 select a.id as a_id,b.del_id as b_id
3 from shop a left outer join del b
4 on a.id = b.del_id )c
5 where b_id is null;


id name id name
– —- — —-
2 Monkey null null
4 Spaghetti null null


结果集: 产生在A表中有而在B表中没有的集合。

1 SELECT * FROM TableA
2 FULL OUTER JOIN TableB
3 ON TableA.name = TableB.name
4 WHERE TableA.id IS null
5 OR TableB.id IS null


id name id name
– —- — —-
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader


结果集: 产生A表和B表都没有出现的数据集。

还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

1 SELECT * FROM TableA
2 CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

分享到:
评论

相关推荐

    hadoop入门学习教程 之10.Hive工作原理和基本使用

    hadoop入门学习教程 之10.Hive工作原理和基本使用,出自《Cloudera Hadoop 4 实战课程》,hadoop入门学习教程用到技术:CDH4,Cloudera Manager,Hive,HBase,Sqoop, Hadoop培训视频教程涉及项目:电商业日志流量...

    大数据技术基础实验报告-Hive安装配置与应用.doc

    大数据技术基础实验报告-Hive安装配置与应用

    大数据实验六实验报告:熟悉Hive的基本操作

    “大数据技术原理与应用”课程实验报告 题目:实验六:熟悉Hive的基本操作 姓名:小猪猪 日期:2022/5/15 1、实验环境: 设备名称 LAPTOP-9KJS8HO6 处理器 Intel(R) Core(TM) i5-10300H CPU @ 2.50GHz 2.50 GHz 机带...

    Hive总结.docx

    Hive原理/Hive SQL/Hive 函数/数据仓库分层和建模/Hive sql优化/数据倾斜

    第14章 基于Hadoop的数据仓库Hive

    接着详细介绍了Hive的系统架构,包括基本组成模块、工作原理和几种外部访问方式,描述了Hive的具体应用及Hive HA原理;同时,介绍了新一代开源大数据分析引擎Impala及其与Hive的比较分析;最后,以单词统计为例,...

    【63课时完整版】大数据实践HIVE详解及实战

    第1章:Hive基本架构及环境部署 1.MapReduce分析与SQL分析对比 2.Hive的介绍及其发展 3.Hive的安装部署及启动 4.Hive的基本架构讲解 5.安装MySQL作为元数据库存储 6.配置Hive使用MySQL作为元数据库存储 7.Hive中基本...

    基于Hive的注册表

    WinCE 5.0下,基于Hive的注册表基本原理,操作系统加载注册表的基本步骤,使用Hive注册表的操作步骤等

    Hive SQL 编译过程详解

    1、MapReduce实现基本SQL操作的原理 1.1 Join的实现原理 1.2 Group By的实现原理 1.3 Distinct的实现原理 2.1 Phase1 SQL词法,语法解析 2.1.1 Antlr 2.1.2 抽象语法树AST Tree 2.1.3 样例SQL ........... 2.3 Phase...

    大数据技术原理及应用课实验6 :熟悉Hive的基本操作

    2. 熟练使用常用的HiveQL。 二、实验平台 1. 操作系统:Ubuntu18.04(或Ubuntu16.04)。 2. Hadoop版本:3.1.3。 3. Hive版本:3.1.2。 4. JDK版本:1.8。 三、数据集 由《Hive编程指南》(O'Reilly系列,人民邮电...

    厦门大学林子雨版大数据基础入门培训课程 教师培训交流讲义-模块11-基于Hadoop的数据仓库Hive 共48页.ppt

    14.1 概述 14.2 Hive系统架构 14.3 Hive工作原理 14.4 Hive HA基本原理 14.5 Impala 14.6 Hive编程实践

    大数据原理与应用课程设计

    已经学习过大数据相关课程(比如入门级课程《大数据技术原理与应用》),了解大数据相关技术的基本概念与原理,了解Windows操作系统、Linux操作系统、大数据处理架构Hadoop的关键技术及其基本原理、列族数据库HBase...

    Ch6-HBase与Hive程序设计-04201

    1. HBase基本工作原理 2. HBase基本操作与编程方法示例 3. Hive基本工作原理 4. Hive基本操作示例

    Hive编程指南[带标签]

    本资源比较直白的描述了hive的基本功能和原理,以及怎么使用hive进行数据处理。比较适合初学者入门。

    Hadoop学习文档笔记,基本原理 HDFS

    学习时候的笔记 还有简单例子代码 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

    大数据初学者学习指南(建议收藏).docx

    大数据初学者学习指南 大数据初学者学习指南是为了帮助新手快速入门大数据领域的学习指南。...通过本指南,读者可以快速入门大数据领域,了解Hadoop和Hive的原理和应用场景,并掌握基本的编程和SQL技能。

    大数据Hue架构原理.pdf

    "大数据Hue架构原理.pdf" ...学习Hue需要具备一定的IT基础知识和大数据知识,包括了解Hue是什么,会使用Hue操作HDFS,会使用Hue在Hive上执行Hive SQL,会使用Hue查看MR2(Yarn)任务的运行状态与日志信息等。

    开源力量——数据挖掘原理与实战

    整套大数据课程从hadoop入门开始,由浅入深,内置“hadoop源码解析与企业应用开发实战”,“Hive开发实战”,“Hbase开发实战”,“Spark,mahout,sqoop,storm诸模块开发实战”,“数据挖掘基础。这个系列课程有几...

    大数据培训视频.zip

    6.2_Hive功能与架构-Hive基本操作 7.1_Streaming简介-系统架构 7.2_关键特性介绍-StreamCQL介绍 8.1_Flink概述-Flink原理与技术架构 8.2_Flink原理与技术架构-Flink在FusionInsight HD中的集成情况 9.1_Loader简介-...

    大数据技术原理及应用习题集.doc

    本资源摘要信息涵盖了大数据技术的原理和应用,包括大数据的基本特征、技术和核心技术、计算模式、云计算、物联网的关系、Hadoop 生态系统、伪分布式 Hadoop 安装、HDFS 和 HBASE 的功能、数据分析和挖掘、数据模型...

    数据库审计系统基本原理与部署方式.pdf

    数据库审计系统基本原理与部署⽅式 数据库审计系统简介 什么是数据库审计? 数据库审计是记录数据库被访问⾏为的⽇志系统。 访问数据库的⼀般有两种⾏为,⼀种是应⽤服务区的访问,⼀种是数据库运维⼈员的访问。 ...

Global site tag (gtag.js) - Google Analytics