博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive简介
阅读量:4163 次
发布时间:2019-05-26

本文共 3142 字,大约阅读时间需要 10 分钟。

一篇Google的学术论文让Map/Reduce这个概念风靡全球,Hadoop是Apache对Map/Reduce这种分布式计算框架的开源实现,通过Hive我们能想执行SQL那样执行我们的HadoopJob。

一、Hive的安装

如何安装Hive网上有N多的文档,一般来说你准备搭建Hadoop平台的你就绝对不会吝啬这么点的时间去搭建个Hive平台,具体就参考官方去吧。

二、开启Hadoop之旅

 

1.Hive表的创建与维护

在Hive里面创建一张表的基本语法同SQL类似,下面就是一个简单的表创建语法:

CREATE TABLE tmp_table #表名(title   string, # 字段名称 字段类型minimum_bid     double,quantity        bigint,have_invoice    bigint)COMMENT '注释:XXX' #表注释 PARTITIONED BY(pt STRING) #分区表字段(如果你文件非常之大的话,采用分区表可以快过滤出按分区字段划分的数据) ROW FORMAT DELIMITED    FIELDS TERMINATED BY '/001'   # 字段是用什么分割开的STORED AS SEQUENCEFILE; #用哪种方式存储数据,SEQUENCEFILE是hadoop自带的文件压缩格式

其中PARTITIONED 在数据量比较大的时候非常有用,比如你想在Hadoop上存放每天镜像商品的时候,通过PARTITIONED 分区可以快速筛选某一天的数据。访问时候通过“  SELECT * FROM TMP_TABLE WHERE PT='XXX‘ ”的方式通过分区来访问数据。分区表是通过子文件夹的方式来存放数据的,所以速度提高是光速级的。其它的几个表相关有有那个的命令:

SHOW TABLES; # 查看所有的表SHOW TABLES '*TMP*'; #支持模糊查询SHOW PARTITIONS TABLE; #查看表有哪些分区DESCRIBE TABLE; #查看表结构

 

2.将数据加载到表中

Hive可以将本地的和Hadoop中的文件加载到表中,但是文件的分割方式必须同创建表的约定的格式一致:

#创建表的时候直接指定路径CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,                    page_url STRING, referrer_url STRING,                    ip STRING COMMENT 'IP Address of the User',                    country STRING COMMENT 'country of origination')    COMMENT 'This is the staging page view table'    ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '12'    STORED AS TEXTFILE    LOCATION '/user/data/staging/page_view'; #创建表之后也可以导入数据到表中#本机路径(跳板机)LOAD DATA LOCAL INPATH `/tmp/date.txt` OVERWRITE INTO TABLE page_view PARTITION(pt='2008-06-08')#Hadoop路径LOAD DATA INPATH `/tmp/date.txt` OVERWRITE INTO TABLE page_view PARTITION(pt='2008-06-08')#上面OVERWRITE关键会全表覆盖,如果只是想附加数据,将OVERWRITE去掉即可。 #添加一个分区到表ALTER TABLE tmp_xx ADD PARTITION (pt='100610') location '/group/mywork/hive/xx/pt=100610' ;#当然你可以直接从从其它的表拖数据过来 INSERT OVERWRITE TABLE TMP_T1 SELECT * FROM TMP_T2;

 

3.执行Query开始快速M/R之旅

Hive支持目前常用的SQL语法,支持COUNT,SUM,AVG,GROUP等常用的SQL函数还支持hive一些自定义的函数方便数据分析用,当然你可以自定义函数,理论上讲在java中能实现的功能,它都能胜任,详情参见: ,先来几个常用的示例吧。

#统计数量SELECT COUNT(1) FROM T1;#汇总数量SELECT SUM(A) FROM T1;#求平均值SELECT AVG(A) FROM T1;#GROUPSELECT A,COUNT(1) FROM T1 GROUP A;

这样执行之后数据最后会在屏幕上打印出来的,显然这不是我们想要,只适合开发的时候测试数据用,为了不让数据打满跳板机最好加下“LIMIT 10”参数限制下总数,省得把跳板机压垮。通过以下方式可以提取查询的结果

INSERT OVERWRITE TABLE  T1 SELECT * FROM T2;#然后通过 hadoop fs -getmerge dir ldir 命令直接从hdfs系统中提取数据#当然你也可以直接放到本地目录INSERT OVERWRITE LOCAL DIRECTORY '/tmp/T1' SELECT * FROM T2;#Hive也支持JOININSERT OVERWRITE TABLE  T3 SELECT T1.*,T2.* FROM T1 T1  join T2 T2  on (T1.A = T2.A) ;

 

4.HIVE到底是什么?

看着这么上面强大的功能,那Hive到底是什么呢?其实HIVE就是一个SQL解析引擎,它将SQL语句转译成M/R JOB然后在Hadoop执行,来达到快速开发的目的。拨开HIVE的神秘面纱之后来看它的表其实就是一个Hadoop的目录/文件(HIVE默认表存放路径一般都是在你工作目录的hive目录里面),按表名做文件夹分开,如果你有分区表的话,分区值是子文件夹,可以直接在其它的M/R job里直接应用这部分数据。

三、FAQ

1.几个常用的参数

  • set mapred.reduce.tasks=30;  设置Reduce Task个数
  • set hive.exec.compress.output='false'; 设置数据不作压缩,要是压缩了我们拿出来的文件就只能通过HIVE-JDBC来解析

2.注意事项

  • 做JOIN操作的时候最好将数量少的表放在左边。
  • Reduce的排序是单机的,如果一定要结果排序,那边你的Reduce Task数量最好设置成一个。
  • 慎用System.xxx.println来输出日志,要是不小心把每行记录都打印出来那边整个Hadoop集群都有崩溃的危险。
  • 如果表建立了PARTITIONS,那么分析需求的时候尽量利用好这批分区表。如果你们的分区表是拿来做每天的镜像数据的(我们公司就是这么来用的),那边你更加要小心处理,不然你的JOB就可能破你们集群的记录。
  • 测试JOB的时候尽量加上LIMIT参数,毕竟Hadoop不是数据库,每个JOB都是需要一定的时间的。

 

转自:

转载地址:http://hwtxi.baihongyu.com/

你可能感兴趣的文章
深入入门正则表达式(java) - 命名捕获
查看>>
使用bash解析xml
查看>>
android系统提供的常用命令行工具
查看>>
【Python基础2】python字符串方法及格式设置
查看>>
【Python】random生成随机数
查看>>
【Python基础3】数字类型与常用运算
查看>>
【Python基础4】for循环、while循环与if分支
查看>>
【Python基础6】格式化字符串
查看>>
【Python基础7】字典
查看>>
【Python基础8】函数参数
查看>>
【Python基础9】浅谈深浅拷贝及变量赋值
查看>>
Jenkins定制一个具有筛选功能的列表视图
查看>>
【Python基础10】探索模块
查看>>
【Python】将txt文件转换为html
查看>>
[Linux]Shell脚本实现按照模块信息拆分文件内容
查看>>
idea添加gradle模块报错The project is already registered
查看>>
在C++中如何实现模板函数的外部调用
查看>>
在C++中,关键字explicit有什么作用
查看>>
C++中异常的处理方法以及使用了哪些关键字
查看>>
内存分配的形式有哪些? C++
查看>>