前言
1.hive简介
1.1 hive组件与相应功能:
1.2 hive的表类型
1.3 分区表
1.3 分隔符
1.4 hive的数据存储
2.数据类型
2.1 基本数据类型
2.1 复杂数据类型
2.3 NULL
3.基本操作
3.1 数据库操作
3.2 表操作
3.3 视图
3.4 数据导入导出
3.hsql
3.1 hsql基本操作
3.2 hive内置函数
3.2 自定义函数
3.3 注册函数
4.hive权限管理
4.1 权限简介
4.2 权限分类
4.3 授权管理
5.hive优化

前言

本手册介绍了hive的基本知识及工作中要注意的要点,适用于hive入门.开发人员请关注hive表操作以及UDF.

1.hive简介

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

1.1 hive组件与相应功能:

  • CLI
    hive命令行工具,用于执行sql等.
  • beeline
    功能等同于CLI,区别是beeline通过hiveserver2提交请求
  • hive metatstore
    hive元数据管理服务,客户端工具连接metastroe使用元数据
  • hiveserver2
    hiveserver2为应用程序提供JDBC接口,例如beeline
  • hcatalog
    hive元数据接口模块

1.2 hive的表类型

  • 内部表
    内部表:通过指定的元数据格式创建的表,可以指定存储位置\存储格式等,完全由hive来管理.删除内部表时同时删除表数据.当前用sqoop导入的数据都是内部表.
  • 外部表
    外部表:hdfs上的数据,hive只是对数据做元数据映射来创建表.删除外部表不会删除数据.

1.3 分区表

hive支持分区表,在查询时指定分区字段可以过滤无用分区.分为静态分区和动态分区.

  • 静态分区:
    静态分区:指手动创建的分区.在创建表时需要额外指定分区键,如:

    create external table if not exists cheap_hotel_user(device string, booking_freq int, book_price string) partitioned by (day string);

    或者通过alter table来添加分区:

    ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1';

  • 动态分区:
    动态分区:可以根据指定字段的值自动创建分区(参考ORACLE的数据自动插入到对应分区).默认不开启动态分区,需要修改参数hive.exec.dynamic.partition实现,动态分区上限为10000个.

1.3 分隔符

  • 字段分隔符
    默认是\001.在建表时可以指定,如:FIELDS TERMINATED BY '\036'.注意:不要写成'\0X1E'.
  • 行分隔符
    默认是\n,不可更改.

1.4 hive的数据存储

  • 数据存储格式
    hive支持Text File\SequenceFile\RCFile\Avro Files\ORC Files\Parquet以及自定义文件类型.当前使用的是ORC格式.ORC格式是一种高性能的带压缩的文件格式,支持多种特性,甚至支持hive的update操作.建表时指定文件格式:"STORED AS ORC". [点此了解hive文件格式]

2.数据类型

2.1 基本数据类型

类型 长度 示例
tinyint 1byte有符号整数 20
smallint 2byte有符号整数 20
int 4byte有符号整数 20
bigint 8byte有符号整数 20
boolean 布尔类型,true or flase TRUE
float 单精度浮点数 3.14159
double 双精度浮点数 3.1415923
string 字符.可以指定字符集,用引号或又引号 '中国' "中国"
date 日期类型 '2017-03-06'
timestamp 时间戳.整数 浮点(带纳秒)数或字符串. 122327493795.123456789

2.1 复杂数据类型

类型 长度 示例
struct 类似C语言中的结构体 如果类型为struct(name string,age int),则可存的值可为 struct('bijr',3)
map 键值对应的组合 map(k1,v1,k2,v2)
array 数组,和java数组一样 array('a','b','c')
union 存储指定类型中的一个或多个 union(string,int,date)->union(1,'2017-03-06')

注意:表时不要使用HIVE关键字.

2.3 NULL

NULL代表该字段值是空缺的,查询时显示为'NULL',底层存储为'\N'.像其它数据库一样,可以用IS (NOT) NULL来查询.

3.基本操作

3.1 数据库操作

  • 创建数据库

    create database [IF NOT EXISTS] simple;

  • 查看数据库

    show databases;

  • 删除数据库

    drop database [IF EXISTS] simple;

  • 选择数据

    use simple;

3.2 表操作

  • 创建内部表

    create table [IF NOT EXISTS] test(id int,name string, age int,dt date)
    [ROW FORMAT DELIMITED]
    [FIELDS TERMINATED BY '\001']
    STORED AS ORC [LOCATION '/user/hive/SIMPLE/test'] ;

  • 创建外部表

    create EXTERNAL table [IF NOT EXISTS] test2(id int,name string, age int,dt date)
    FIELDS TERMINATED BY '\001'
    LOCATION '/tmp/test2' ;

注意:在外部表中,location是必须的,分隔符根据文件而定.

  • 创建分区表

    CREATE TABLE XDGL_HIS.FLOW_OPINION_ARCH(
    serialno string,
    opinionno string,
    objecttype string
    createtime string,
    etl_in_dt string)
    PARTITIONED BY ( p_day string)
    ROW FORMAT DELIMITED
    STORED AS ORC
    LOCATION '/user/hive/S4/CRM_SERVICE_TYPE' ;

  • 设置动态分区

    set hive.exec.dynamic.partition=true;

  • 查看表分区

    show partitions XDGL_HIS.FLOW_OPINION_ARCH;

    动态分区分区个数默认上限为10000.

  • 从一个表创建另一个表,只创建表结构

    create table test2 like test;
    create table tests as select * from test where 1=2;

  • 查看表信息

    desc test;
    desc extended test;
    desc formatted test;

    • 重命名表

      ALTER TABLE test RENAME TO testtest;

  • 查询数据

    select name,age from test where id =2;
    select * from test where id =2;
    查询表时,只查需要的列,不要用select *,这样可以减少处理的数据量优化查询速度.

  • 删除数据

    delete from test where id=2;

  • 增加列

    ALTER TABLE test ADD COLUMNS (c1 INT);

注意:增加字段只会在现在有字段后面添加字段.

  • 删除列
    hive没有删除列的操作.原因是hive只负责管理元数据,并不对HDFS上的文件中的内容做删除.删除列可以用replace实现,实际上就是重建表的元数据.

    ALTER TABLE test REPLACE COLUMNS (
    id int,
    name string,
    age int,
    dt date
    );

这样就删除掉了c1字段,实际上并未修改HDFS上的文件.

  • 修改字段

    alter table test change c1 c2 bigint;

同时修改了字段名和类型.

3.3 视图

视图将查询结果展示给用户,可以屏蔽无用数据.

  • 创建视图
create view asselect course, teacher, buildingfrom teaches, teacher_tablewhere teaches.teacher_id = teacher_table.teacher_id and teaches.dept_name = 'CS'

视图中并不存放数据,只存放元数据.视图在每次被select时都会执行计算,因此可能比较慢.如果不需要实时数据,可以将视图替换会为实体表.
注意:某些组件无法使用hive的视图,比如presto.

3.4 数据导入导出

点击查看hive DML文档

  • 向表中insert数据
  1. insert inito test values(1,'yangxw',20,'2017-03-07');
    插入单条数据

  2. create table test2 likie test;
    insert into test2 select id,name,age,dt from test;
    从一个表向另外一个表插入数据

  3. insert overwrite table test2 select id,name,age,dt from test;
    从一个表向另外一个表插入数据,覆盖原表数据

  4. insert overwrite table XDGL_HIS.FLOW_OPINION_ARCH partition(p_day = 2016)
    select serialno,opinionno,objecttype,createtime,etl_in_dt from FLOW_OPINION_ARCH_tmp;
    覆盖指定分区.

注意:
1.新的hive版本支持insert into value()方式插入单条数据,但速度极慢,可做为测试用.
2.使用insert select 方式插入数据,必须对目标表的所有列提供数据,即不能只对指定列插入数据.如:不支持insert into test2(id ,name) select id,name from test这样.

  • 使用load加载数据
    标准语法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]

加上LOCAL时代表是从本地加载文件,不带LOCAL是从HDFS加载文件.

hive扩展语法(一次插入多表)

FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION … [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION …] select_statement2] …;

注意:如果导入的源文件是文本格式,则要替换文本中的 \r \n,否则在hive 的客户端工具中会显示异常.解决办法:导出源文件的脚本中替换\r \n,例如在oracle导出脚本中replace(colun_name,char(10),' '),replace(colun_name,char(10),' ')

  • 数据导出到本地
    标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1[ROW FORMAT row_format] [**STORED AS file_format**] (Note: Only available starting with Hive 0.11.0)SELECT … FROM …

hive扩展语法(导入到多个目录)

FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] …

支持导出的文件格式:

DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char][NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)

LOCAL时数据导出到本地,不使用LOCAL时导出到HDFS.字段分隔符是 ^A.

  • 使用sqoop从ORACLE导数据到hive
sqoop import --connect jdbc:oracle:thin:@//${db_ipaddr}/${db_schema} --username ${db_username} --password '${db_passwd}' --query " select SERIALNO, OBJECTTYPE, OBJECTNO, FEETYPE, to_char(SYNCHDATE, 'YYYY-MM-DD HH24:mi:ss') as SYNCHDATE  from XDGL.ACCT_FEE_ARCH where SYNCHDATE > (TO_DATE('${DAY}', 'YYYY-MM-DD') -1) and  $CONDITIONS " --hcatalog-database STAGE --hcatalog-table ACCT_FEE_ARCH --hcatalog-storage-stanza 'stored as ORC' --hive-partition-key p_day --hive-partition-value ${DAY} --hive-delims-replacement " " -m 1

当前从其它系统同步到大数据平台时,加了ETL_IN_DATE字段来标识导入时间.
注意:使用JDBC导入到hive中时,要替换文本中的 \r \n,否则在hive 的客户端工具中会显示异常.解决办法:导出源文件的脚本中替换\r \n,例如在oracle导出脚本中replace(colun_name,char(10),' '),replace(colun_name,char(10),' ')

  • 使用sqoop从hive导数据到ORACLE
1.  `sqoop export --table tableName2 \ #oracle表`
2.  `--connect jdbc:oracle:thin:@127.0.0.1:1521:ORCL \`
3.  `--username username \ #oracle用户`
4.  `--password password \ #密码`
5.  `--hcatalog-database DB1 \ #catalog数据库`
6.  `--hcatalog-table tableName2 \ #catalog表`
7.  `--hcatalog-partition-keys p_month \ #`
8.  `--hcatalog-partition-values 2016-11 \`
9.  `--columns "serialno",\`
10.  `"contractstatus",\`
11.  `"rno",\`
12.  `"rname",\`
13.  `"stores",\`
14.  `"sname",\`
15.  `"etl_in_dt"`

3.hsql

hsql的语法和mysql很像,.

3.1 hsql基本操作

大多数时候都可以像使用mysql一样使用hive,以下只列出要注意的地方.
点击查看hive用户手册
点击查看hive select语句文档

SELECT [ALL | DISTINCT] select_expr, select_expr, …
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[   CLUSTER BY col_list| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]

  • group by,Order by, Sort by, Cluster by, and Distribute By

    • group by
      和其它数据库的group by是一样的

      select sum(amt),city from pos group by city;

    • order by[aes|desc] [nulls last|nulls first]
      对数据做全局排序.因所全局排序,所以只有一个reduce处理数据.
      注意:hive中order by 时null值是"最小"的,而oracle中order by 时null值是"最大"的

hive:
hive> select * from tnull order by c ;
2    NULL
1    a
hive> select * from tnull order by c desc;
1    a
2    NULL
oracle:
SQL> select * from tnull order by c ;
ID C
1 aa
2
SQL> select * from tnull order by c desc;
ID C
2
1 aa

  • sort by
    sort by 是在map数据传给reduce之前排序,只能保证map内有序,不能保证全局有序.

  • Distribute By 功能.
    控制map数据如果分发给reduce,默认是hash方式.常和sort by 一起使用.

  • Cluster by
    同时具有有 sort by \Distribute By 功能.

    • 子查询
      hive支持from where两种子查询:
>SELECT … FROM (subquery) AS name …   #from子查询
>SELECT * #where in
>FROM A
>WHERE A.a IN (SELECT foo FROM B);
>SELECT A #where exits(旧版本可能不支持)
>FROM T1
>WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y);

注意:hive不支持嵌套子查询,可以改成join来完成

select (select adress from b where b.userid=a.userid) adress from a.

3.2 hive内置函数

hive内置函数包括:操作符\字符串函数\数学函数\日期函数\分析函数(窗口函数)等.具体参考文档.
点击查看hive内置函数
点击查看hive分析函数

3.2 自定义函数

点击查看hive插件开发
创建自定义函数要使用UDF接口:

package com.example.hive.udf;import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;public final class Lower extends UDF {public Text evaluate(final Text s) {if (s == null) { return null; }return new Text(s.toString().toLowerCase());}
}

hive中计算的数据往往是巨大的,hive的函数按行数处理,因此不要在自定义函数中再嵌入循环之类的操作,如用jdbc查询另外一个数据库等。

3.3 注册函数
  • 临时函数
    先执行Add jars把函数相关的jar包加入到hive中,然后注册:
CREATE TEMPORARY FUNCTION function_name AS class_name;
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

eg:

[hive@hadoop2 ~]$ add jar /path/to/lower.jar
hive>create temporary function xxoo_lower as 'test.ql.LowerUDF';

注意:临时函数只在当前session有效,关了这个会话就没了。

  • 永久函数
    同临时函数一样,也要把函数相关实现打成jar,不同之处是要把jar放到hdfs上
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE ``'file_uri'` `[, JAR|FILE|ARCHIVE ``'file_uri'``] ];
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

eg:

hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
hive> create function xxoo_lower as 'test.ql.LowerUDF' using jar 'hdfs:///path/to/hive_func/lower.jar'

4.hive权限管理

默认情况下,hive没有开启权限控制,想要开启权限控制需要设置一些参数.
hive权限的详细操作

4.1 权限简介

hive的权限角色分为:

  • 用户
    用户即LINUX操作系统用户.hive没有自定义的用户.

  • 组即操作系统上的组.可以对组授权,组内所有用户均获得该权限.
  • 角色
    角色是权限的集合.将角色授权个用户或组,将该用户或组将获得角色的所有权限.
  • 超级用户
    hive需要写代码实现超级用户

4.2 权限分类

4.3 授权管理

拥有相应权限并且有WITH ADMIN OPTION权限的用户可以授权给别人.比如A用户在表t上有select权限,并且有WITH ADMIN OPTION权限,那么可以授权给B用户查询t表的权限:

grant select on testdb.test to user B;

  • 角色
CREATE ROLE role_name
DROP ROLE role_name

  • 角色权限
GRANT ROLE role_name [, role_name] …
TO principal_specification [, principal_specification] …
[WITH ADMIN OPTION]REVOKE [ADMIN OPTION FOR] ROLE role_name [, role_name] …
FROM principal_specification [, principal_specification] …principal_specification:USER user| GROUP group| ROLE role

  • 授权
GRANTpriv_type [(column_list)][, priv_type [(column_list)]] …[ON object_specification]TO principal_specification [, principal_specification] …[WITH GRANT OPTION]REVOKE [GRANT OPTION FOR]priv_type [(column_list)][, priv_type [(column_list)]] …[ON object_specification]FROM principal_specification [, principal_specification] …REVOKE ALL PRIVILEGES, GRANT OPTIONFROM user [, user] …priv_type:ALL | ALTER | UPDATE | CREATE | DROP| INDEX | LOCK | SELECT | SHOW_DATABASE object_specification:TABLE tbl_name| DATABASE db_nameprincipal_specification:USER user| GROUP group| ROLE role

  • 查询用户的权限
SHOW GRANT user|group|role XXX
[ON table|database [(column_list)]]

5.hive优化

hive使用的是mapreduce计算框架,因此优化都是围绕mr来做.具体请参考:
点击查看hive 优化官方文档

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/skyrim/p/7455263.html

HADOOP docker(六):hive简易使用指南相关推荐

  1. 大数据数据仓库——hive学习权威指南

    友情提示:更多有关大数据.人工智能方面技术文章请关注博主个人微信公众号:大数据分析爱好者社区! 学习hive权威指南 目录: ETL介绍 大数据平台架构概述 系统数据流动 hive概述 hive在ha ...

  2. hive性能优化指南

    1.概述 继续<hive性能优化指南--初级篇>一文中的剩余部分,本篇博客赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题.下面开始本篇文章的优化介绍. 2.介绍 ...

  3. hadoop+zookeeper+hbase+hive

    hadoop安装配置 hadoop安装文档:https://blog.csdn.net/pucao_cug/article/details/71698903 zookeeper安装文档:https:/ ...

  4. Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)

    文章目录 修改虚拟机IP 复制网卡的配置 Vi编辑器的常用命令 实操部分 复制网卡的配置 Hadoop集群初体验 20.secondarynameNode如何辅助管理FSImage与Edits文件 ⭐ ...

  5. Hadoop数据仓库工具——Hive

    一.什么是Hive: 1)基于Hadoop的数据仓库解决方案 - 将结构化的数据文件映射为数据库表 - 提供类sql的查询语言HQL(Hive Query Language) - Hive让更多的人使 ...

  6. (第7篇)灵活易用易维护的hadoop数据仓库工具——Hive

    摘要: Hive灵活易用且易于维护,十分适合数据仓库的统计分析,什么样的结构让它具备这些特性?我们如何才能灵活操作hive呢? 博主福利 给大家推荐一套hadoop视频课程 [百度hadoop核心架构 ...

  7. Hadoop最常用的工具(SQL on Hadoop):Hive

    认识Hive 对十Hadoop的出现,无论是业界还是学术界对其都给予了极高的关注度,Hadoop及其生态圈提供了一个成熟高效的处理海量数据集的解决方案.随着Hadoop越来越流行,一个问题也随之产生: ...

  8. Hadoop 系列之 Hive

    Hadoop 系列之 Hive Hive 的官网:http://hive.apache.org/ Hive versions 1.2 onward require Java 1.7 or newer. ...

  9. hadoop+HBase+ZooKeeper+Hive完全分布式集群部署安装

    本文源自:https://www.cnblogs.com/linxizhifeng/p/7207655.html 1.        系统环境 1.1.   软件版本 下表为本系统环境所安装的软件的版 ...

最新文章

  1. 吊打一切的YOLOv4的tricks汇总!附参考论文下载
  2. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...
  3. Hydra 8.4/8.5新增功能
  4. 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)
  5. 企业上云的数据库演进之路
  6. .NET静态类的概念
  7. js中的事件循环和宏任务和微任务的理解
  8. 缩减oracle日志,[20180829]减少日志生成量.txt
  9. [转]java 中的序列化是什么意思?有什么好处?
  10. Android自动化测试【初级篇】-- Monkey测试
  11. gcc is unable to create an executable file.
  12. mp3 资源文件压缩
  13. 雷锋科普:小米M2之芯高通APQ8064芯片组解析
  14. 计算机功能转动怎么设定,怎么旋转电脑屏幕
  15. win7系统服务器文档,win7系统服务器
  16. ssm客户关系管理系统
  17. stl库的使用——队列queue和优先队列和优先队列小根堆(全家桶哎)
  18. 7-19 评委打分 (15 分)
  19. ORACLE 获取某一日期所在周的周一
  20. python获取当前时间并格式化_python获取当前时间并格式化

热门文章

  1. [转]VS清除打开项目时的TFS版本控制提示
  2. Maven web项目的项目如何创建
  3. IPS不用添加service帐号进入linux使得管理主机能访问的方法
  4. STP状态切换详述(Cisco实现)
  5. 设置crontab用vi打开编辑
  6. [转] Asp.net mvc 3 beta 新特性介绍
  7. 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(下)-转
  8. 锁定Mac的键盘:连击5次option键
  9. 1004. 成绩排名 (20)-PAT乙级真题
  10. c语言编写自动生成密码,c语言密码生成.doc