`

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语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

分享到:
评论

相关推荐

    hive基本操作

    hive 基本操作的命令和hive 实用命令等,有利与学习hive和mysql

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

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

    Hive原理与实现

    ### Hive原理与实现 #### 一、Hive的概述与意义 Hive 是一个构建于 Hadoop 之上的数据仓库工具,它提供了类 SQL 的查询语言(HQL),使得用户可以方便地处理存储在 Hadoop 分布式文件系统(HDFS)中的大规模数据集...

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

    【大数据技术基础实验报告-Hive安装配置与应用】 在大数据处理领域,Apache Hive是一个非常重要的组件,它提供了基于Hadoop的数据仓库工具,用于数据查询、分析以及存储。本实验报告将详细阐述如何安装、配置Hive,...

    hive实现原理

    学习 Hive 的实现原理对于更好地使用 Hive 至关重要: 1. **提高执行效率**:了解 Hive 如何执行 SQL 可以帮助优化查询语句,减少不必要的 MapReduce 任务,从而提高执行效率。 2. **解决性能瓶颈**:理解 Hive 的...

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

    在大数据处理领域,Hive是一种基于Hadoop的数据仓库工具,它允许用户使用SQL类的语言(称为HiveQL)对大规模数据进行分析和处理。在这个实验中,我们将深入理解Hive的角色以及如何执行基本操作。 首先,Hive在...

    HiveSQL编译原理

    HiveSQL编译原理是大数据处理领域中的一个重要概念,它主要涉及到如何将用户提交的SQL语句转换为可执行的MapReduce或者Tez任务。在Hadoop生态系统中,Hive作为一个基于HDFS的数据仓库工具,提供了对大规模数据集进行...

    Hive SQL 编译过程详解

    - **Distinct的实现原理**:对于单个Distinct字段,Hive会在Map阶段将Group By字段与Distinct字段组合成key,通过Reduce阶段的LastKey机制去重。而对于多个Distinct字段,可以通过两种方法实现:一是使用Hash去重,...

    HiveSQL解析原理.docx

    本文旨在深入探讨HiveSQL解析原理及其如何将SQL转化为MapReduce过程,并解释MapReduce如何实现基本SQL操作。 #### 二、MapReduce实现基本SQL操作的原理 在深入理解Hive如何将SQL语句转换为MapReduce任务之前,我们...

    Hive总结.docx

    与传统的数据库(如MySQL、Oracle)相比,Hive更侧重于分析操作,存储大量历史数据,响应时间相对较慢,但适合大规模数据的离线分析。 1.2 Hive原理 Hive的工作流程主要包括以下步骤: - 用户通过各种接口(CLI、...

    Hive_JDBC.zip_hive java_hive jdbc_hive jdbc pom_java hive_maven连

    理解Hive JDBC的工作原理以及如何在Java项目中正确配置和使用它是大数据开发中的关键技能之一。通过这个实例,你现在已经具备了使用Hive JDBC的基础知识,可以进一步探索更高级的Hive和Java集成技术。

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

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

    hive udaf 实现按位取与或

    总结来说,实现“hive udaf 实现按位取与或”涉及到理解Hive UDAF的工作原理,编写Java代码来定义UDAF,以及在Hive查询中正确地使用这些自定义函数。这不仅增强了Hive的功能,还使得大数据处理更加灵活和高效。

    Hive on Spark源码分析DOC

    本文将对 Hive on Spark 的源码进行深入分析,涵盖其基本原理、运行模式、Hive 解析 HQL、Spark 上下文创建、任务执行等方面。 1. 运行模式 Hive on Spark 支持两种运行模式:本地(LOCAL)和远程(REMOTE)。当...

    Hive简明教程-大数据技术系列

    例如,你可以学习如何使用LOAD DATA命令将数据导入Hive表,使用SELECT语句进行基本查询,以及如何运用GROUP BY和JOIN操作来处理复杂的数据分析任务。此外,Hive支持UDF(用户自定义函数),这使得用户可以根据需要...

    《Hive数据仓库案例教程》教学大纲.pdf

    1. **Hive数据仓库基础**:这一部分主要讲解数据仓库的基本概念,包括数据仓库的特性、数据仓库与数据库的区别,以及Hive数据仓库的原理。学生需要理解Hive架构,以及它在大数据处理中的角色。 2. **Hive环境搭建**...

    深入浅出学习HIVE.pdf

    Hive体系结构包括概念、架构与基本组成、运行模式、数据类型、元数据存储和数据存储,以及HiveUI介绍。HiveShell命令行包含Hivebin下脚本介绍和HiveShell基本操作。 HiveQL是Hive中用于查询和管理数据的SQL语言,...

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

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

    华为大数据认证: Hive分布式数据仓库.pptx

    华为大数据认证:Hive分布式数据仓库课程目标是让学员掌握Hive应用场景与基本原理、掌握FusionInsight中Hive增强特性、熟悉常用Hive SQL语句。课程目录包括Hive概述、Hive功能与架构、Hive基本操作等。 Hive是大...

    尚硅谷大数据技术之 Hive1

    1. **Hive基本概念** Hive是由Facebook开源的一种数据仓库工具,设计用来处理海量的结构化日志数据统计。它基于Hadoop,可以把结构化的数据文件映射成数据库表,并提供SQL-like查询功能。Hive的本质是将HQL(Hive ...

Global site tag (gtag.js) - Google Analytics