hive笔记(自学整理的)

第一部分:用户管理

创建用户:CREATE DATABASE XXX

查看用户:SHOW DATABASES;

关键查看用户:show databases like ‘de.*‘

讲解:创建一个用户就等于在物理目录下创建了一个文件,该文件是以.db结尾的,

默认的路径是:/user/hive/warehouse/zqx.db

创建用户时可以指定路径: create database XXX

location ‘/my/preferred/directory‘

讲解:为后期维护方便,可以创建用户时添加描述内容

create database XXX

comment ‘this is my first database‘;

在使用describe XXX 时,就会看到用户描述信息

删除用户:drop database if exists XXX  --> IF EXISTS是可选的,加上可以避免数据库XXX不存在而报错

讲解:原则上hive是不允许删除一个含有表的database。

1、用户要么先删除掉该用户下所有的表,再删除该用户

2、要么在删除用户语句中加上关键字 CASCADE,它的意思是让hive自动的先删除掉用户下的所有表

drop database if exists XXX cascade;

如果某个用户被删除了,它所对应的物理路径和文件也同时被删除

第二部分:表的管理

创建表:

create table if not EXISTS employees(

emp_id string comment ‘id‘,

name string comment ‘name‘,

phone_number string comment ‘phone‘,

depar_id string comment ‘depart_ID‘

)

comment ‘employees_table‘

location ‘/user/hive/warehouse/zqx.db/employees‘;

---IF NOT EXISTS 是可选的,如果表已经存在,HIVE就会忽略掉后面的执行语句,不会有任何提示。

---LOCATION是指定该表在HDFS中的URL路径。

查看某用户下的表: show tables in zqx;

查看表结构:desc employees;

查询某列:desc employees.phone_number;

修改表: alter table

拷贝已存在数据表的表结构: create table if not exists zqx.copy_table like zqx.employees;

讲解:以上创建的employees在hive中被称为“内部表”,删除该表后,表中的数据也会同时被删除。

讲解:内部表不方便和其他领域进行共享数据,假设使用pig领域进行操作数据,会用到hive领域中的数据,

可并没有给与pig使用权,我们就可以创建一个外部表指向这部分数据,就可以直接访问hive中的数据

外部表:

create external table if not exists departitions(

depart_id string comment ‘depart_id‘,

depart_name string comment ‘departition name‘

)

comment ‘departition name‘

row format delimited fields terminated by ‘,‘

location ‘/user/hive/warehouse/zqx.db/departitions‘

---关键字external表示该表是外部表

---外部表特点:hive认为该表并非拥有这部分数据,删除该表时,不会删除掉数据。

查询数据表是外部表还是内部表: describe extended departitions;

内部表: ... tableType:MANAGER TABLE

外部表: ... tableType:EXTERNAL TABLE

分区表:

create table departements(

depart_id string comment ‘depart id‘,

depart_name string comment ‘depart name‘

)

partitioned by (acct_month string)

row format delimited fields terminated by ‘|‘

stored as textfile;

---指定按照 acct_month 进行分区

查看是否分区表: show partitions departments;

查看指定分区:show partitions departments partition( acct_month = ‘201509‘ );

给表增加分区:alter table employees add partition( acct_month = ‘201509‘ );

表重命名: alter table employees rename to employees_new ;

对表分区的操作

1、增加表分区: alter table employees add partition(acct_month = ‘201509‘) location = ‘XXXX‘

partition(acct_month = ‘201510‘) location = ‘XXXX‘

.... ;

在同一个怎家语句中,可以添加多个分区。

2、删除表分区: alter table employees drop partition(acct_month = ‘201509‘);

增加列: alter table employees add columns( alter_1 string comment ‘alter one‘,

alter_2 string comment ‘alter two‘ );

讲解:字段添加中文注释报错问题:

由于编码方式不一致导致的

执行comment ‘‘后,中文会保存到mysql中,当编码方式不一致时,保存进去的就会是乱码,所以报错。

解决1:给字段添加注释时,需要转换编码方式,设置成UTF-8

(1)修改表字段注解和表注解

alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;

alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

(2) 修改分区字段注解:

alter table PARTITION_PARAMS  modify column PARAM_VALUE varchar(4000) character set utf8 ;

alter table PARTITION_KEYS  modify column PKEY_COMMENT varchar(4000) character set utf8;

解决2:

修改hive连接mysql的连接为utf-8

<property>

<name></name>

<value>jdbc:mysql://IP:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8</value> 
                          <description>JDBC connect string for a JDBC metastore</description> 
                  </property>

第三部分:数据装载

讲解:目前hive中不支持行级别的数据插入、更改和删除的操作,要想表中有数据,只能通过“大量”的数据

装载操作,通过文件给数据表加载数据。

装载数据: load data local inpath ‘文件放置的目录‘ -->如果该目录不存在的话,会首先创建该目录

overwrite into table employees

partition (acct_month = ‘201509‘);    ----> 如果employees不是分区表,则省略partition子句

local关键字:如果使用了local关键字,那么“文件放置的目录”就为本地文件系统路径,数据被拷贝到目标

位置。

如果省略掉local关键字,那么路径应该是分布式文件系统中的路径,这种情况下,数据是从分

布式文件系统路径转移到目标位置(而不是拷贝)

总结: load data local ... 拷贝本地数据到分布式文件系统上的目标位置

load data ... 从HDFS系统中,将数据从一个集群HDFS中转移到另一个集群HDFS中

讲解:HIVE并不会验证用户装载的数据和表的模式是否匹配。HIVE会验证文件格式是否和表结构是否一致

第三部分:数据导出

insert overwrite local directory ‘XXXX‘ select * from XXX;

sqlldr userid=mid/[email protected] control=tag_file.ctl

sqlldr userid=mid/[email protected] control=sqlldr_ora.ctl direct=true parallel=true

-- direct=true  不展示过程进度

-- parallel=true  并发

转换编码: iconv -f UTF-8 -t GB18030 t_m_make_tag_file.txt1 -o t_m_make_tag_file.txt

第四部分:数据的查询

LIMIT语句:限制查询记录的条数

CASE ... WHEN ... THEN语句:与ORACLE用法一致

讲解:什么情况下HIVE可以避免进行MapReduce

查询原理:假设查询employees表,就是Hive访问employees表对应的存储路径下的文件。

1、只是以分区字段做为查询条件的情况,不会触发MapReduce,这种情况叫:本地模式

例如:select * from departments where acct_month = ‘201509‘  --> acct_month是分区字段

2、属性 hive.exec.mode.local.auto 的参数设置为true,Hive会一直默认使用本地模式执行其他操作

除以上两种情况以外,Hive执行操作,都会触发MapReduce来执行所有查询。

讲解:Hive会对每一个JOIN连接对象启动一个MapReduce任务。

讲解:关于Hive的执行顺序,例如:

select A.ymd,A.price_close,B.price_close,C.price_close

from stocks A JOIN stocks B  ON A.ymd = B.ymd

JOIN stocks C  ON A.ymd = C.ymd

where A.symbol = ‘AAPL‘

and B.symbol = ‘IBM‘

and C.symbol = ‘GE‘;

例子中,会首先启动一个MapReduce Job对表A和表B进行连接操作,

然后再启动一个MapReduce Job将第一个MapReduce Job的输出结果和表C进行连接操作

Hive的执行顺序是按照从左往右执行的。

关于JOIN连接

1、优化:在上面的SQL语句中,表A、B、C在做JOIN关联时,所使用的关联字段都是 ymd ,的这种情

况。(即:所使用的关联字段是相同的字段)

讲解:当3个或者更多个表进行JOIN关联时,如果每个ON自居都使用相同的关联字段的话,就只会产生

一个MapReduce 。

2、关联原理:Hive在执行SQL脚本时,会假定查询中最后一个表是数据量最大的,在对每一行记录进行关联操作时,Hive会将其他的表缓存起来,然后扫描最后那张表。所以要将数据量最大的表放在最后。

3、Hive的标记机制:在编写SQL脚本时,并非总是要将最大的表放置在查询语句的最后,因为Hive提供了一个“标记”,用来指定哪个表的数据量是最大的,Hive就会首先扫描哪个表。

例如:  select /*+STREAMTABLE(s)*/ s.ymd , s.symbol , d.price_close

from stocks s JOIN dividends d

ON s.ymd = d.ymd;

数据类型转换: double 类型 ---> string类型     cast(cast(user_id as bigint) as string)

数据类型:

数据类型 所占字节 开始支持版本
TINYINT 1byte,-128 ~ 127
 
SMALLINT 2byte,-32,768 ~ 32,767
 
INT 4byte,-2,147,483,648 ~ 2,147,483,647
 
BIGINT 8byte,-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
 
BOOLEAN
 

 
FLOAT 4byte单精度
 
DOUBLE 8byte双精度
 
STRING
 

 
BINARY
 
从Hive0.8.0开始支持
TIMESTAMP
 
从Hive0.8.0开始支持
DECIMAL
 
从Hive0.11.0开始支持
CHAR
 
从Hive0.13.0开始支持
VARCHAR
 
从Hive0.12.0开始支持
DATE
 
从Hive0.12.0开始支持
时间: 2024-10-14 18:48:55

hive笔记(自学整理的)的相关文章

Hive笔记整理(一)

[TOC] Hive笔记整理(一) Hive Hive由facebook贡献给Apache,是一款建立在Hadoop之上的数据仓库的基础框架. 数据仓库 特点--关于存放在数据仓库中的数据的说明: 是能够为企业的各个级别的决策提供数据支撑的数据 其实说白了,就是一个存放数据的仓库 数据库和数据仓库之间的区别 现代数据仓库,是构建在数据库之上的,使用数据库作为载体存放数据. 数据仓库着重强调的是存放的历史数据,数据库着重强调的是存放在线的数据. 数据仓库着重强调的是OLAP的操作,数据库着重强调的

Hive笔记整理(二)

[TOC] Hive笔记整理(二) Hive中表的分类 managed_table-受控表.管理表.内部表 表中的数据的生命周期/存在与否,受到了表结构的影响,当表结构被删除的,表中的数据随之一并被删除. 默认创建的表就是这种表. 可以在cli中通过desc extended tableName来查看表的详细信息,当然也可以在MySQL中hive的元数据信息表TBLS中查看. external_table-外部表 表中的数据的生命周期/存在与否,不受到了表结构的影响,当表结构被删除的,表中对应数

Hive笔记整理(三)

[TOC] Hive笔记整理(三) Hive的函数 Hive函数分类 函数的定义和java.mysql一样,有三种. UDF(User Definition Function 用户定义函数) 一路输入,一路输出 sin(30°)=1/2 UDAF(User Definition Aggregation Function 聚合函数) 多路输入,一路输出 max min count sum avg等等 UDTF(User Definition Table Function 表函数) 一路输入,多路输

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

Learning The Bash Shell读书笔记(整理)

最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning The Bash Shell读书笔记(1)bash初识,通配符 Learning The Bash Shell读书笔记(2)重定向,管道,后台 Learning The Bash Shell读书笔记(3)特殊字符,引用,控制键 Learning The Bash Shell读书笔记(4)历史命令 Lea

bootstrap 新手学习笔记 代码整理

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Bootstrap 实例 - 滚动监听(Scrollspy)插件方法</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <script src="js/jqu

hive 笔记

下面以sales和things表为例.这两个表定义如下: hive> SELECT * FROM sales; Joe 2 Hank 4 Ali 0 Eve 3 Hank 2 hive> SELECT * FROM things; 2 Tie 4 Coat 3 Hat 1 Scarf 1.     Inner joins hive> SELECT sales.*, things.* > FROM sales JOIN things ON (sales.id = things.id)

基于CentOS6.5的LNMP下memcached学习笔记的整理

1.概述 Memcached是一个C语言编写的高性能分布式的内存对象缓存系统,用于减少Web应用直接跟数据库交互,从而减轻数据库负载压力,将一些经常访问的数据对象以K/V(键/值)对的形式存放在内存中作为缓存数据.缓存是一种加速应用向后端服务器读取数据的优化手段,其思想是用对内存的读取换取直接对磁盘数据库中数据的操作,以提高web应用程序的访问速度,从而实现web动态页面高性能.高并发的访问. Memcached是通过C语言Danga Interactive开发编写的,使用libevent框架实

Hadoop之——Hive笔记

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46496123 1.Hive 1.1在hadoop生态圈中属于数据仓库的角色.他能够管理hadoop中的数据,同时可以查询hadoop中的数据. 本质上讲,hive是一个SQL解析引擎.Hive可以把SQL查询转换为MapReduce中的job来运行. hive有一套映射工具,可以把SQL转换为MapReduce中的job,可以把SQL中的表.字段转换为HDFS中的文件(夹)以及文