HADOOP docker(六):hive简易使用指南

本文详细介绍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 基本数据类型
类型长度示例
tinyint1byte有符号整数20
smallint2byte有符号整数20
int4byte有符号整数20
bigint8byte有符号整数20
boolean布尔类型,true or flaseTRUE
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 as
    select course, teacher, building
    from teaches, teacher_table
    where 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
  • 授权
GRANT
    priv_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 OPTION
    FROM user [, user] …

priv_type:
    ALL | ALTER | UPDATE | CREATE | DROP
  | INDEX | LOCK | SELECT | SHOW_DATABASE 

object_specification:
    TABLE tbl_name
  | DATABASE db_name

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

5.hive优化

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





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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值