Hive数据仓库笔记(二)
分区和桶:
分区:可以提高查询的效率,只扫描固定范围数据,不用全部扫描
CREATE TABLE logs (ts BIGINT, lineSTRING) PARTITIONED BY (dt STRING, country STRING);
通过关键字PARTITIONED BY 定义分区表
LOAD DATA LOCAL INPATH '/home/data/file1'
INTO TABLE logs
PARTITION (dt='2001-01-01',country='GB');
加载数据到分区表的时候,分区字段的值需要被明确指定。
当在导入一些数据,可以看到Hive分区表的目录结构:
/user/hive/warehouse/logs
├── dt=2001-01-01/
│├── country=GB/
││ ├── file1
││ └── file2
│└── country=US/
│└── file3
└── dt=2001-01-02/
├── country=GB/
│└── file4
└── country=US/
├── file5
└── file6
查看分区表的分区信息:
hive> SHOW PARTITIONS logs;
dt=2001-01-01/country=GB
dt=2001-01-01/country=US
dt=2001-01-02/country=GB
dt=2001-01-02/country=US
只查跟该分区相关的信息:
SELECT ts, dt, line
FROM logs
WHERE country='GB';
桶表:
组织表或者分区表为桶表的两个原因:
1. 提高查询效率针对Map join
2. 使取样更高效
创建桶表:
CREATE TABLE bucketed_users (id INT,name STRING)
CLUSTERED BY (id) INTO 4 BUCKETS;
指明分桶的列和数量
CREATE TABLE bucketed_users (id INT,name STRING)
CLUSTERED BY (id) SORTED BY (id ASC)INTO 4 BUCKETS;
排序使Map join更加高效
创建users表
CREATE TABLE users (id int, name String )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
导入测试数据:
LOAD DATA LOCAL INPATH '/home/data/users.txt'
OVERWRITE INTO TABLE users ;
为了hive识别创建表时定义的桶的数量设置 hive.enforce.bucketing属性为true.
set hive.enforce.bucketing=true
将users表的数据导入:
INSERT OVERWRITE TABLE bucketed_users
SELECT * FROM users
通过hadoop dfs -ls /user/hive/warehouse/bucketed_users; 查看可以知道每个桶代表一个文件,4个桶就是4个文件。
每个桶有一部分数据
通过以下命令查看:
hive> dfs -cat/user/hive/warehouse/bucketed_users/000000_0;
0Nat
4Ann
TABLESAMPLE 取样数据 返回表的1/4
hive> SELECT * FROM bucketed_users
> TABLESAMPLE(BUCKET 1 OUT OF 4 ON id);
4 Ann
0 Nat
返回表数据的1/2
hive> SELECT * FROM bucketed_users
> TABLESAMPLE(BUCKET 1 OUT OF 2 ON id);
4 Ann
0 Nat
2 Joe
如果对没有分桶的表进行取样,使用rand()函数,即使只是取样一部分数据,也会扫描整个数据集。
hive> SELECT * FROM users
> TABLESAMPLE(BUCKET 1 OUT OF 4 ONrand());
2 Joe
存储格式:
默认的存储方式:Delimited text 分隔符是Ctrl-A
因此CREATE TABLE ...;就相当于
CREATE TABLE ...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
Binary storage formats: Sequence files,Avro datafiles, Parquet files, RCFiles, and ORCFiles
二进制格式分为:面向列的格式和面向行的格式
面向列的格式处理表里列少的情况,面向行的格式处理单行里列比较多的情况。
Hive支持的面向行的两种格式:Avrodatafiles、sequence files
表被存储成Avro格式:
SET hive.exec.compress.output=true;
SET avro.output.codec=snappy;
CREATE TABLE ... STORED AS AVRO;
Hive支持的面向列的格式:Parquet,RCFile, and ORCFile
创建一个副本表使用PARQUET格式:
CREATE TABLE users_parquet STORED ASPARQUET
AS
SELECT * FROM users;
自定义SerDe:RegexSerDe:
使用自定义SerDe加载数据,SerDe需要使用正则表达式
常用的正则表达式元字符:
|
代码 |
说明 |
|
. |
匹配除换行符以外的任意字符 |
|
\w |
匹配字母或数字或下划线或汉字 |
|
\s |
匹配任意的空白符 |
|
\d |
匹配数字 |
|
\b |
匹配单词的开始或结束 |
|
^ |
匹配字符串的开始 |
|
$ |
匹配字符串的结束 |
CREATE TABLE stations (usaf STRING, wbanSTRING, name STRING)
ROW FORMAT SERDE'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(\\d{6})(\\d{5}) (.{29}) .*"
);
LOAD DATA LOCAL INPATH "/home/data/stations-fixed-width.txt"
INTO TABLE stations;
自定义SerDe 从文件里读固定宽度的位置的元信息,如果不是指定的宽度,该行记录为null。
自定义SerDe效率不高。
导数据:
inserts:
INSERT OVERWRITE TABLE target
SELECT col1, col2
FROM source;
分区表:
INSERT OVERWRITE TABLE target
PARTITION (dt='2001-01-01')
SELECT col1, col2
FROM source;
动态指定分区:
INSERT OVERWRITE TABLE target
PARTITION (dt)
SELECT col1, col2, dt
FROM source;
Hive里可以把From放到前面:
FROM source
INSERT OVERWRITE TABLE target
SELECT col1, col2;
多表插入更加高效,源表只扫描一次可产生不同的输出。
FROM records2
INSERT OVERWRITE TABLE stations_by_year
SELECT year, COUNT(DISTINCT station)
GROUP BY year
INSERT OVERWRITE TABLE records_by_year
SELECT year, COUNT(1)
GROUP BY year
INSERT OVERWRITE TABLE good_records_by_year
SELECT year, COUNT(1)
WHERE temperature != 9999 AND quality IN(0, 1, 4, 5, 9)
GROUP BY year;
一个源表records,三个不同的表通过查询同一张表获得数据。
CREATETABLE...AS SELECT:
CREATE TABLE target
AS
SELECT col1, col2
FROM source;
更改表:
重命名表名:
ALTER TABLE source RENAME TO target;
添加新的列:
ALTER TABLE target ADD COLUMNS (col3STRING);
由于hive不允许更新已经存在的记录数据,所以该方法一般的替代方案是重新创建新表CTAS。
删除表:
删除数据,对于外部表只删除元数据信息,数据遗留着。
DROP TABLE my_table;
删除所有数据但保存表的定义:
TRUNCATE TABLE my_table;
TRUNCATE不支持外部表,替代方案是dfs –rmr 直接删除外部表目录。
如果创建一个新的空表跟另一个表有相同模式使用like 关键字:
CREATE TABLE new_table LIKE existing_table;
查询数据:
hive> FROM records2
> SELECT year, temperature
> DISTRIBUTE BY year
> SORT BY year ASC, temperature DESC;
1949 111
1949 78
1950 22
1950 0
1950 -11
每个ReducerSORT BY 后都会产生一个文件。
DISTRIBUTE BY 控制给定年份的数据进入相同的reducer分区,如1950 年的进入相同Reducer分区
Hive数据仓库笔记(二)的更多相关文章
- Hive学习笔记二
目录 Hive常见属性配置 将本地库文件导入Hive案例 Hive常用交互命令 Hive其他命令操作 参数配置方式 Hive常见属性配置 1.Hive数据仓库位置配置 1)Default数据仓库的最原 ...
- Hive数据仓库笔记(一)
Hive建表: CREATE TABLE records (year STRING,temperature INT, quality INT) ROW FORMAT DELIMITED FIELDS ...
- Hive数据仓库笔记(三)
Joins: Inner joins: hive> SELECT * FROM sales; Joe 2 Hank 4 Ali 0 Eve 3 Hank 2 hive> SELECT * ...
- Hive数据仓库工具安装
一.Hive介绍 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单SQL查询功能,SQL语句转换为MapReduce任务进行运行. 优点是可以通过类S ...
- 【大数据】Hive学习笔记
第1章 Hive基本概念 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表, ...
- Hive—学习笔记(一)
主要内容: 1.Hive的基本工能机制和概念 2.hive的安装和基本使用 3.HQL 4.hive的脚本化运行使用方式 5.hive的基本语法--建表语法 6.hive的基本语法--内部表和外部表. ...
- HIVE—数据仓库
1. hive是什么? Hive是基于 Hadoop 的一个数据仓库工具: 1. hive本身不提供数据存储功能,使用HDFS做数据存储: 2. hive也不分布式计算框架,h ...
- hive数据仓库入门到实战及面试
第一章.hive入门 一.hive入门手册 1.什么是数据仓库 1.1数据仓库概念 对历史数据变化的统计,从而支撑企业的决策.比如:某个商品最近一个月的销量,预判下个月应该销售多少,从而补充多少货源. ...
- hive学习笔记之一:基本数据类型
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- 小技巧:selenium java中如何使用chrome默认的profile
使用浏览器默认的profile可以在一定程度上实现免登录的效果,另外默认的profile中很多文件都被缓存了,也有利于加快测试的速度 System.setProperty("webdrive ...
- Java中的volatile的作用和synchronized作用
volatile该关键字是主要使用的场合是字啊多个线程中可以感知实例的变量被更改了并且可以获取到最新的值进行使用,也就是用多线程读取共享变量的时候可以获取到最新的值使用.不能保障原子性 如果你在jvm ...
- ubuntu上lamp环境搭建
首先,介绍个彻底删除linux已经安装的软件的方法. sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-5. ...
- Qt 开发 MS VC 控件终极篇
Qt 开发 MS VC 控件终极篇 1. 使用 MSVC2015 通过项目向导创建 Qt ActiveQt Server 解决方案 项目配置:以下文件需要修改 1. 项目属性页->项目属性-&g ...
- hihoCoder Demo Day dp
题意:有一个机器人被困在一个的迷宫中,机器人的初始位置是,目的地是,并且它的移动方式很奇怪:只能一直向右,直到不能再向右才能把方向变成向下:只能一直向下,直到不能再向下才能把方向变成向右.迷宫中的每个 ...
- CodeForces - 788B Weird journey 欧拉路
题意:给定n个点,m条边,问能否找到多少条符合条件的路径.需要满足的条件:1.经过m-2条边两次,剩下两条边1次 2.任何两条路的终点和起点不能相同. 欧拉路的条件:存在两个或者0个奇度顶点. 思路 ...
- 两种实现方式mycat多租户,枚举分片,注解拦截
第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式 /*!mycat:schema=[schemaName] */ 注意:这在navicat 里面是会报错的,请用命令行登陆myc ...
- flask项目开发中,遇到http 413错误
在flask项目中,上传文件时后台报http 413 Request Entity Too Large 请求体太大错误! 解决的2种方法: 1.在flask配置中设置 MAX_CONTENT_LENG ...
- directdraw显示yuv422(yuy2)
#include <mmsystem.h> void CshowpicDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 height ...
- dojo中取查询出来的地市维表数据的id
1.页面中引入隐藏域 <input type="hidden" id="area_desc"/> 2.通过在属性中设置 onchange:funct ...