文档章节

Hive基础

张超
 张超
发布于 2015/02/15 17:30
字数 2399
阅读 63
收藏 0
点赞 0
评论 1
Hive
    数据仓库工具。可以把Hadoop下的原始结构化数据变成Hive中的表
    支持一种与SQL几乎完全相同的语言HiveQL。除了不支持更新、索引和事务,几乎SQL的其它特征都能支持
    可以看成是从SQL到Map-Reduce的映射器
    提供shell、JDBC/ODBC、Thrift、Web等接口

Hive简介
    起源自facebook由Jeff Hammerbacher领导的团队
    构建在Hadoop上的数据仓库框架
    设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据
    2008年facebook把hive项目贡献给Apache

Hive现状
    Hadoop生态圈中的重要项目
    企业级数据仓库的主流架构之一
    解决“即席查询”的问题
    注意Cloudera的Impala项目,号称比Hive要快3-30倍
    兼容SQL是目前大数据产品的风向标

Hive的组件不体系架构
    用户接口:shell, thrift, web等
    Thrift服务器
    元数据库,如Derby, Mysql等
    解析器
    Hadoop

Hive安装
    内嵌模式:元数据保持在内嵌的Derby中,只允许一个会话连接
    本地独立模式:在本地安装Mysql,把元数据放到Mysql内
    远程模式:元数据放置在远程的Mysql数据库

Hive shell
创建表:
hive> create table stu(
id int,
name string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

从本地文件系统中导入数据到Hive表
hive> load data local inpath 'stu.txt' into table stu;

HDFS上导入数据到Hive表
hive> load data inpath '/home/stu/add.txt' into table stu;

从别的表中查询出相应的数据并导入到Hive表中
hive> insert into table stu
select id, name from stubak;

在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
hive> create table stutest
as
select id, name from stu;

查询
hive> select * from stu;

表连接
hive> select ta.ca, tb.cb from ta join tb on (ta.id=tb.id);

JDBC/ODBC接口
用户可以像连接传统关系数据库一样使用JDBC戒ODBC连接Hive
目前还不成熟

JDBC的具体连接过程
1.使用jdbc的方式连接Hive,首先做的事情就是需要启动hive的Thrift Server,否则连接hive的时候会报connection refused的错误。
启动命令:hive --service hiveserver
2.新建java项目,然后将hive/lib下的所有jar包和hadoop的核心jar包hadoop-*-core.jar添加到项目的类路径上。
3.样板代码
public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
    Connection connection = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");

    String dropSql = "drop table pokes";
    String createSql = "create table pokes (foo int,bar string)";
    String insertSql = "load data local inpath '/home/grid/hive/kv1.txt' overwrite into table pokes";
    String querySql = "select bar from pokes limit 5";

    Statement statement = connection.createStatement();
    statement.execute(dropSql);
    statement.execute(createSql);
    statement.execute(insertSql);
    ResultSet rs=statement.executeQuery(querySql);
    while(rs.next()){
        System.out.println(rs.getString("bar"));
    }
}
Web接口
启动:[grid@hadoop1 ~]$ hive --service hwi
假设hive部署在 192.168.0.104 机器上,conf/hive-default.xml文件都是默认值,那么我们直接在浏览器中输入:http://192.168.0.104:9999/hwi/ 就可以访问了

Hive的数据放在哪儿?
    数据在HDFS的warehouse目录下,一个表对应一个子目录
    桶与reduce
    本地的/tmp目录存放日志和执行计划

关于数据类型


存储格式:缺省分隔符


DDL操作
    Data Defining Language
    定义数据库
    定义表

改变数据库存放目录,缺省存放目录由hive.metastore.warehouse.dir指定,可以使用以下命令覆盖
hive> create database testdb1
location '/my/db/testdb1';

观看数据库描述
hive> create database testdb1
comment 'all test tables';
hive> describe database testdb1;

hive> create database testdb1
with dbproperties ('creator'='grid','date'='2015-02-15');
hive> describe database extended testdb1;

切换数据库
hive> use testdb1;
显示当前数据库
hive> set hive.cli.print.current.db=true;

删除和更改数据库,默认不允许用户删除一个包含有表的数据库
hive> drop database if exists testdb1;
级联删除,在删除库之前删除全部的表
hive> drop database if exists testdb1 cascade;

hive> alter database testdb1 set dbproperties ('edited-by' = 'tiger');

列出表
hive> show tables;

观看表的描述
hive> describe extended testdb1.tb1;
hive> describe testdb1.tb1.cl1;

外部表
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

创建外部表
create external table if not exists etb2
(
id int,
name string
)
row format delimited fields terminated by ','
location '/data/etb2';

创建分区表
create table employees
(
name string,
age int
)
partitioned by (city string);

分区表的存储:会变成一个子目录里面的一系列文件
Strict模式及其对操作的影响
hive> set hive.mapred.mode=strict; 此时查询一定要带上分区条件
hive> set hive.mapred.mode=nonstrict;

列出分区
hive> show partitions employees partition(city='WH');

指定存储格式
create table employees
(
name string,
age int
)
row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as textfile;

删除和更改表
hive> drop table if exists employees;
hive> alter table employees rename to tb_employees;
hive> alter table tb_employees add if not exists
partition(city='SH') location '/employees/SH'
partition(city='TJ') location '/employees/TJ';
hive> alter table tb_employees partition(city='SH')
set location '/employees/SH1';

列操作
ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT  --列重命名
COMMENT 'The hours, minutes, and seconds part of the timestamp'  --列注释
AFTER severity;  --更改字段位置

--新增列
ALTER TABLE log_messages ADD COLUMNS (
app_name STRING COMMENT 'Application name',
session_id LONG COMMENT 'The current session id');

--REPLACE COLUMNS 先删除现存列,然后再增加新列。替换列只能在表使用自带SerDe(DynamicSerDe,MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe)时使用
ALTER TABLE log_messages REPLACE COLUMN (
 hours_mins_secs INT COMMENT 'hour, minute, seconds from timestamp',
 severity     STRING COMMENT 'the message severity',
 message      STRING COMMENT 'the rest of the message');

DML操作
    Data Manipulation Language
    传统意义的DML包括Insert,delete,update操作
    Hive不支持行级别的insert、delete、update,将数据放入表中的唯一办法是批量载入(bulk load),或使用Hive以外的其它方法。作为数据仓库平台,这种操作逻辑尚可接受。

--Load data
LOAD DATA LOCAL INPATH '${env:HOME}/california-exmployees'
OVERWRITE INTO TABLE employees
PARTITION (country = 'US', state = 'CA');

--insert overwrite
INSERT OVERWRITE TABLE employees PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se WHERE se.cnty = 'US' AND se.st = 'OR';

FROM staged_employees se INSERT OVERWRITE TABLE employees
  PARTITION (country = 'US', state = 'OR') SELECT * WHERE se.cnty = 'US' AND se.st = 'OR'
  PARTITION (country = 'US', state = 'CA') SELECT * WHERE se.cnty = 'US' AND se.st = 'CA'
  PARTITION (country = 'US', state = 'IL') SELECT * WHERE se.cnty = 'US' AND se.st = 'IL';

--Dynamic Partition Inserts 动态分区
set hive.exec.dynamic.partition=true;
set hive exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;

INSERT OVERWRITE TABLE employees PARTITION (country, state)
  SELECT ..., se.cnty, se.st FROM staged_employees se;

INSERT OVERWRITE TABLE employees PARTITION (country = 'US', state)
  SELECT ..., se.cnty, se.st FROM staged_employees se WHERE se.cnty = 'US';

--Create table ... as select ...
CREATE TABLE ca_employees
AS SELECT name, salary, address FROM employees WHERE se.state='CA';

导出数据
    由于数据文件本身是文本明文,所以可以直接使用hdfs的拷贝文件导出
    如果需要改劢数据格式,可以使用insert overwrite,如下例
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address FROM employees WHERE se.state='CA';

查询语句select
大部分语句的语法和常见的关系型数据库Oracle,MySQL等类似,实现的是它们的一个子集
SELECT name, subordinates FROM employees;

使用正则表达式
SELECT symbol, `price.*` FROM stocks;
SELECT name, salary, address FROM employees WHERE address.street LIKE '%Ave.';

explode函数
hive> SELECT array(1,2,3) FROM dual;
[1,2,3]
hive> SELECT explode(array(1,2,3)) AS element FROM src;
1
2
3

--Nested Select
FROM (
  SELECT upper(name), salary, deductions["Federal Taxes"] as fed_taxes,
  round(salary * (1 - deductions[Federal Taxes])) as salary_minus_fed_taxes
  FROM employees
) e
SELECT e.name, e.salary_minus_fed_taxes WHERE e.salary_minus_fed_taxes > 10000;
PS:deductions 是MAP类型

聚组操作优化
SET hive.map.aggr = true;
SELECT count(*), avg(salary) FROM employees;

连接操作
    支持大部分常见的关系型数连接方式(各种内连接,外连接,半连接等)
    连接是缓慢的操作!
    使用“map-side joins”优化连接

MapJoin顾名思义,就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。

MapJoin的原理:
即在map 端进行join,其原理是broadcast join,即把小表作为一个完整的驱动表来进行join操作。

SELECT /*+ MAPJOIN(d) */ s.ymd, s.symbol, s.price_close, d.divided
FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol
WHERE s.symbol = 'AAPL';

set hive.auto.convert.join=true; --hive 0.11之后,在表的大小符合设置时自动使用MapJoin

SELECT s.ymd, s.symbol, s.price_close, d.divided
FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol
WHERE s.symbol = 'AAPL';
--hive.auto.convert.join.noconditionaltask=true
--hive.auto.convert.join.noconditionaltask.size=10000
--hive.mapjoin.smalltable.filesize=25000000

排序
    Order by 、sort by 、Distribute by 、Cluster by
1、order by 会对输入做全局排序,因此只有一个reducer
2、sort by 不是全局排序,其在数据进入reducer前完成排序
3、根据 distribute by 指定的内容将数据分到同一个reducer
4、Cluster by
除了具有 Distribute by 的功能外,还会对该字段进行排序。因此,常常认为 cluster by = distribute by + sort by

bucket
    抽样查询是数据分析里常见的操作,Hive可以直接支持
SELECT * FROM numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;

块级抽样
SELECT * FROM numbersflat TABLESAMPLE(0.1 PERCENT) s;

视图与索引
    Hive具有与关系型数据库基本类似的视图功能
    Hive只有非常简单的索引(早期甚至没有索引),关系型数据库的索引是用B+树算法实现的,Hive的索引叧是简单地把排序数据放到另外一个表中

CREATE INDEX employees_index ON TABLE employees (country)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD
IDXPROPERTIES ('creator'='me', 'created_at'='some_time')
IN TABLE employees_index_table
PARTITIONED BY (country, name)
COMMENT 'Employees indexed by country and name.';

位图索引
Hive 0.8开始引入,适合列上有大量重复值的场景
CREATE INDEX employees_index ON TABLE employees (country)
AS 'BITMAP'
WITH DEFERRED REBUILD
IDXPROPERTIES ('creator'='me', 'created_at'='some_time')
IN TABLE employees_index_table
PARTITIONED BY (country, name)
COMMENT 'Employees indexed by country and name.';

执行计划 Explain

© 著作权归作者所有

共有 人打赏支持
张超
粉丝 42
博文 132
码字总数 100517
作品 0
广州
后端工程师
加载中

评论(1)

s
superboyli520
感谢分享!!!
永久自定义hive函数

永久自定义hive函数 1:做这件事的原因: 有一些函数是比较基础的,公用的,每次都要create temporary function麻烦了,这样的基础函数需要直接集成到hive中去,避免每次都要创建。 2:步骤 ...

八戒_o
2016/04/26
72
0
[Hadoop大数据]——Hive初识

Hive出现的背景 Hadoop提供了大数据的通用解决方案,比如存储提供了Hdfs,计算提供了MapReduce思想。但是想要写出MapReduce算法还是比较繁琐的,对于开发者来说,需要了解底层的hadoop api。...

青夜之衫
2017/12/05
0
0
大数据实验室(大数据基础培训)——Hive的安装、配置及基础使用

为某企业做的培训,完整文档见:http://gudaoxuri.github.io/bd-lab/ 10. Hive 10.1. 环境准备 cd /opt/workspaces 创建Hive数据目录 mkdir data/hive 创建Hive日志目录 mkdir logs/hive 10...

孤岛旭日
2016/05/06
36
0
Hive代码组织及架构简单介绍

hive三个主要组件 Serialzers/Deserialzers(trunk/serde) 此组件允许用户自己开发自定义序列化、反序列化文件解析器,hive自身也内置了一些序列化解析类。 MetaStore(trunk/metastore) 此组件...

扫大街的程序员
2013/11/03
2.7K
0
大数据实验室(大数据基础培训)——概要

为某企业做的培训,完整文档见:http://gudaoxuri.github.io/bd-lab/ 1. 概要说明 本工程为大数据培训的指导教程,包含了培训实践各个环节的说明及相关代码。 1.1. 课程概要 名称 内容 第一天...

孤岛旭日
2016/05/06
97
0
Hive Remote模式搭建

一、实验环境 1.软件版本:apache-hive-2.3.0-bin.tar.gz、mysql-community-server-5.7.19 2.mysql JDBC驱动包:mysql-connector-java-5.1.44.tar.gz 3.mysql已经安装在hadoop5上 4..主机规划......

一语成谶灬
2017/09/21
0
0
hive视频教程|Hive入门及实战演练(2017版本)

Hive入门及实战演练(2017版本) 网盘地址:https://pan.baidu.com/s/10RZX4Eqrrn8F1MfXrkFM5g 密码: ecbv 备用地址(腾讯微云):https://share.weiyun.com/5rDivzP 密码:xsdfyq hive是基于...

人气王子333
04/18
0
0
presto入门安装使用

为了分析海量数据,需要寻找一款分布式计算的开源项目,以前用的比较多的是hive,但是由于hive任务最终会被解析成MR任务,MR从硬盘读取数据并把中间结果写进硬盘,速度很慢,所以要寻找一款基...

Small-Liu
2016/06/24
1K
1
一种海量日志存储、分析解决方案V1.0

本方案试运行中,待观测其性能、稳定性及健壮性,请勿直接应用生产。 涉及的技术栈。 hadoop,版本2.6.0,主要用来存储数据及进行离线分析。 hive,版本1.2.1,主要用来管理数据(注意没有用...

尚浩宇
2016/11/11
769
0
腾讯分布式数据仓库--TDW

腾讯分布式数据仓库项目,在Hadoop和hive的基础上开发的腾讯内部最大的离线数据处理平台。TDW支持Oracle功能兼容的SQL语法,支持PB级的存储和TB级的计算等。 这个项目主要的应用场景是构建低...

红薯
2014/03/30
6.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaEE——JavaScript

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 JavaScript 内置对象 String对象方法: date对象...

凯哥学堂
6分钟前
0
0
Git 远程代码回滚master

方式一(推荐): git revert commit-id 方式二(不推荐):不推荐原因:推送到线上后,其它开发人员需要重新clone git reset --hard commit-id git push origin HEAD --force...

浮躁的码农
6分钟前
0
0
Elasticesearch学习(7)—— ES查询与Java API的对应关系

1、普通查询 类型 ES查询语句 Java查询实现 结果 查询格式 { "query": { "bool": { "must": [], "must_not": [], "should": [], "filter": [] } }, "from": 0, "size": 10, "sort": [] } Que......

叶枫啦啦
6分钟前
4
0
getElementsByClassName()与getElementById()区别

1.document.getElementsByClassName() 返回的是数组 使用:document.getElementsByClassName("className")[0].innerText='具体内容' 2.document.getElementById() 返回的是单个元素 使用:d......

botkenni
17分钟前
0
0
MyBatis入门

一、安装 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency> 二、从 XML 中构建 SqlSessionFactory String r......

一个yuanbeth
18分钟前
0
0
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
21分钟前
0
0
【转】使用Lombok来优雅的编码

前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。 正文 添加依赖 在 pom.xml 文件中添加相关依赖:...

HAVENT
23分钟前
0
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
30分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
39分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部