文档章节

浅谈hive

一只好青年
 一只好青年
发布于 2014/04/21 23:54
字数 1372
阅读 792
收藏 2

谈下一个新人对hive的理解,不喜勿喷。

    hive是hadoop整个项目使用中最常用的辅助项目之一。

    hadoop基础的组件有hdfs和mapreduce。hdfs完成整个hadoop集群中数据的存储,采用google的bigTable架构,其实我觉得就是将数据平分为多份,然后平分给分布式中的各机器上,存储在上面的数据就像一个隐藏文件,你在本地硬盘上找不到它们,但却可以通过hadoop中hdfs指令显示和操作它们,像hadoop dfs -ls 路径。而mapreduce则是将存储在集群中的数据进行分布式计算,由原来1台电脑的工作放到集群中所有电脑上,因此它的运算效率会有显著的提高。

    说完了hdfs和mapreduce,你应该对hadoop有个基本的了解了,咱们再说下hive。

    hive是通过解析你所写的HiveQL语句,来进行mapreduce计算,实现数据仓库中分析数据的作用。hive其实就是针对mapreduce写了一系列的方法和类,咱们可以通过写HIVEQL的形式执行mapreduce.用hiveQL能实现的功能你都能在mapReduce中写出来,如果你不闲麻烦的话。。。

    说下hive的主要功能:数据ETL(抽取、转换、加载)工具、数据存储和大型数据集的查询和分析能力。

    hive包含了四种数据模型:表(Table)、外部表(External Table)、分区(Partition)、桶(bucket)。

    表和外部表个人感觉用起来没什么区别, 有区别的地方只不过是外部表在创建的时候数据没有移动到数据仓库目录中,也就是说外部表不是由它自己来管理。而删除外部表的时候,只会删除元数据,外部表内的数据不会被删除。

    而分区和桶。。。就用分区。。不过分区和桶应该都是为了优化hive的分析效率而做的架构,我原来放10号到20号的数据都放个一个文件中,现在,我通过分区,将10号到20号的每日数据存储在以天为单位的存储文件中,这样,我查询某一天的数据时只是查询这一天的文件,而不是查询未分区前的整个文件,这样,效率就上来了,当然,这只是我的理解,可能还有其它作用。。。

    我理解的hive的基本工作是:将metadata存到hive自建的表中,然后通过操作和分析hive表中的数据,得到你想要的分析结果。

    hive的元数据存储有三种方式:

    一、Single User Mode.其实就是将metadata存储在一个内存数据库(derby)中。内存才多大啊,所以日常中基本不用。

    二、Multi User Mode. 通过是连接本机的MySql,来获取元数据。这是日常和工作中最常用的一种方式。。貌似是工作中。。

    三、Remote Server Mode .其实就是通过本机的thrift协议访问另一个服务器上的metaStoreServcer,metadata不在本地。

    关于hive配置,不多说了,网上一堆。。。

   关于hive中表的操作,我说下容易让人误会的地方:

    hive虽然有表的概念,但它是一个离线数据分析工具,建表只是为了分析服务的,而分析的数据你不可能一条一条插入进去,或者删几条。。而它的正常使用方式是将metadata导入到hive表中,再通过hiveQL分析hive表中的数据。所以hive中不提供手动插入一条或几条数据。有手动就得有自动,自动我举个例子:insert overwrite table abc select * from bbc;这就是我认为的自动。。。。不能手动增加数据了,只能导入数据或自动添加数据。那么删除和修改呢,妥妥的也不能。

    关于hive语句的介绍也不多说了,网上也一堆,说的都挺清楚明白的。不过,这里我还得举个例子,关于我今天写的一个,烦了我一天的mapjoin...

     mapjoin 有两个好处:1.关联的两张表中有一个表非常小时,mapjoin可以将小表中的数据加载到内存中,然后在map阶段会自动大表中的数据,效率还不错。like :select /*+ mapjoin*/ a.id,a,username from a join b on (a.id=b.id)。这是在对等的情况下,效率相当不错。

                          2.还有一个好处就是它可以实现不对等连接。。 join ..on  ()  ,on 后面会跟对等的条件,像a.id=b.id ,你如果跟个like 会报错。而mapjoin可以实现不对等条件,就是在join后面不用on了,直接用where,不过这个效率,试了下,个人感觉效率不高。。like :select /*+ mapjoin*/ a.id,a,username from a join b where a.username like 'error')。

            关于hive其它的方面我还没有看。。等以后看完了,再谈下感受吧。。

 

    PS: 关于mapjoin()的非等值测试:

    两张表:pv_temp_test1(大表)  ,title_keyword_test(小表)

             pv_temp_test1:  530180 条 

             title_keyword_test  5646 条

  测试语句 :

hive> insert overwrite table hbase_test_keyword 
select /*+ mapjoin(a)*/ a.keyword,b.dt,b.pid,b.area,count(*),count(distinct clientid) from title_keyword_test a join (select dt,pid,area,wd,clientid from pv_temp_test1 where wd!='' and wd != 'None') b where b.wd like concat('%',a.keyword,'%') group by  a.keyword,b.dt,b.area,b.pid;

   花费时间:4927秒......

PS:第一次写博客。。想把自己下班之后的时间利用起来,写了快2个小时,挺累,不喜勿怪。。。

© 著作权归作者所有

一只好青年
粉丝 3
博文 4
码字总数 4393
作品 0
海淀
私信 提问
加载中

评论(2)

一只好青年
一只好青年 博主

引用来自“小小小七”的评论

不错啊森之,要是有些代码截图,运行效果啥的就Perfect了。哈哈
额。。。你是?下次就加上代码。。。
小小小七
小小小七
不错啊森之,要是有些代码截图,运行效果啥的就Perfect了。哈哈
浅谈hive中数据的几种压缩方式

hive库中有个表,表名叫做userinfobase表创表的命令是: create table userinfobase( id string, name string, age string )row format delimited fields terminated by 't' LINES TERMINATE......

zcb_data
2018/05/11
0
0
浅谈开源大数据平台的演变

一说到开源大数据处理平台,就不得不说此领域的开山鼻祖Hadoop,它是GFS和MapReduce的开源实现。虽然在此之前有很多类似的分布式存储和计算平台,但真正能实现工业级应用、降低使用门槛、带动...

dongzhumao
2015/04/20
0
0
浅谈开源大数据平台的演变

一说到开源大数据处理平台,就不得不说此领域的开山鼻祖Hadoop,它是GFS和MapReduce的开源实现。虽然在此之前有很多类似的分布式存储和计算平台,但真正能实现工业级应用、降低使用门槛、带动...

fdhay
2016/09/26
22
0
浅谈开源大数据平台的演变

一说到开源大数据处理平台,就不得不说此领域的开山鼻祖Hadoop,它是GFS和MapReduce的开源实现。虽然在此之前有很多类似的分布式存储和计算平台,但真正能实现工业级应用、降低使用门槛、带动...

aibati2008
2016/07/01
28
0
4月12日云栖精选夜读:阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术

2018年4月11-12日,2018亚太CDN峰会在北京隆重召开,大会由亚太CDN领袖论坛、电视云论坛、短视频论坛、视频云论坛、新技术论坛、运营商论坛、国际云论坛等7大部分组成。在视频云论坛上,阿里...

yq传送门
2018/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
4分钟前
2
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
32分钟前
2
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
33分钟前
4
0
Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
38分钟前
18
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
57分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部