分区和桶:

 

分区:可以提高查询的效率,只扫描固定范围数据,不用全部扫描

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数据仓库笔记(二)的更多相关文章

  1. Hive学习笔记二

    目录 Hive常见属性配置 将本地库文件导入Hive案例 Hive常用交互命令 Hive其他命令操作 参数配置方式 Hive常见属性配置 1.Hive数据仓库位置配置 1)Default数据仓库的最原 ...

  2. Hive数据仓库笔记(一)

    Hive建表: CREATE TABLE records (year STRING,temperature INT, quality INT) ROW FORMAT DELIMITED FIELDS ...

  3. Hive数据仓库笔记(三)

    Joins: Inner  joins: hive> SELECT * FROM sales; Joe 2 Hank 4 Ali 0 Eve 3 Hank 2 hive> SELECT * ...

  4. Hive数据仓库工具安装

    一.Hive介绍 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单SQL查询功能,SQL语句转换为MapReduce任务进行运行. 优点是可以通过类S ...

  5. 【大数据】Hive学习笔记

    第1章 Hive基本概念 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表, ...

  6. Hive—学习笔记(一)

    主要内容: 1.Hive的基本工能机制和概念 2.hive的安装和基本使用 3.HQL 4.hive的脚本化运行使用方式 5.hive的基本语法--建表语法 6.hive的基本语法--内部表和外部表. ...

  7. HIVE—数据仓库

    1. hive是什么? Hive是基于 Hadoop 的一个数据仓库工具: 1.       hive本身不提供数据存储功能,使用HDFS做数据存储: 2.       hive也不分布式计算框架,h ...

  8. hive数据仓库入门到实战及面试

    第一章.hive入门 一.hive入门手册 1.什么是数据仓库 1.1数据仓库概念 对历史数据变化的统计,从而支撑企业的决策.比如:某个商品最近一个月的销量,预判下个月应该销售多少,从而补充多少货源. ...

  9. hive学习笔记之一:基本数据类型

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. 二叉排序树、平衡二叉树、B树&B+树、红黑树的设计动机、缺陷与应用场景

    之前面试时曾被问到"如果实现操作系统的线程调度应该采用什么数据结构?",因为我看过ucore的源码,知道ucore是采用斜堆的方式实现的,可以做到O(n)的插入.O(1)的查找.我 ...

  2. AGC012 - E: Camel and Oases

    原题链接 题意简述 沙漠中有个排成一条直线的绿洲,一头储水量为的骆驼. 骆驼有两个操作: 走到距离在V以内的一个绿洲. 飞到任意一个绿洲,但V减少一半.V=0时不能飞. 问骆驼依次从每个绿洲出发,能否 ...

  3. Linux中文件夹的文件按照时间倒序或者升序排列

    1.按照时间升序 命令:ls -lrt 详细解释: -l use a long listing format 以长列表方式显示(详细信息方式) -t sort by modification time ...

  4. probabilistic robotics_Kalman filter(一)

    码农生活告一段落,继续.... 多元正态分布 协方差矩阵,为正定对称矩阵.det表示行列式 协方差反应随机样本变量各分量之间的相关性. 当变量的假设模型不一致时,不适合用高斯滤波. 叠加高斯噪声的线性 ...

  5. VC中基于 Windows 的精确定时

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...

  6. 深入理解StrongReference,SoftReference, WeakReference和PhantomReference

    Java 中一共有 4 种类型的引用 : StrongReference. SoftReference. WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵) ...

  7. 电脑开机后,就会自动运行chkdsk,我想取消chkdsk,怎么取消

     每次开机都自动检查磁盘,检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况,即使重装系统,仍可能出现同样情况,但是硬盘可以通过Dell 随机带的检测程序解决方法:在命令行窗口中 ...

  8. List转换成JSON对象报错(五)

    List转换成JSON对象 1.具体错误如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...

  9. 利用Eclipse中的Maven构建Web项目报错(一)

    利用Eclipse中的Maven构建Web项目 1.在进行上述操作时,pom.xml一直报错 <project xmlns="http://maven.apache.org/POM/4 ...

  10. 使用NPOI导入导出标准Excel

    尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文. 曾使用过的方法 ...