Hive应用(5.1)文件格式及压缩

对于I/O密集型的job来说,使用压缩可以有效的提高IO和网络的吞吐量,对于CPU密集型的job则有可能会降低性能。

1. 压缩编码选择

可以使用如下命令查看当前hive中安装的压缩编解码器

1
2
3
set io.compression.codecs

io.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec
编码 压缩后大小 压缩速度 是否可分割
GzipCodec
BZip2Codec
DeflateCodec(default)
SnappyCodec
Lz4Codec

2.中间压缩

开启中间压缩可以减少mapper和reducer之间传输的数据量,中间压缩优先选择速度快、资源消耗低的方式

Read More

Hive应用(2.1)DDL

HiveQL时Hive的查询语言,语法和Mysql有很多相似之处

1.数据库

1.1 查看所有数据库

Hive中默认有一个default数据库,使用如下命令查看hive中的数据库:

1
SHOW (DATABASES|SCHEMAS) [LIKE 'identifier_with_wildcards'];

1.2创建数据库

创建一个新的数据库:

1
2
3
4
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path] --自定义数据库文件位置
[WITH DBPROPERTIES (property_name=property_value, ...)];

Read More

Hive应用(1.2)文本文件数据编码及读时模式

1.文本文件数据编码

Hive在文本文件中默认分割符如下:

分隔符 描述
\n 默认的记录分隔符,两条记录由\n进行切分
^A 默认的列分隔符,一条记录的不同列由^A切分,八进制编码\001
^B ARRARY、STRUCT、MAP中的元素分割,八进制编码\002
^C MAP中的键值之间分割,八进制编码\003

可以在建表时自定义这4个分隔符:

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE users (
name STRING,
age SMALLINT,
address STRUCT<street:STRING, city:STRING, state:STRING>,
contacts MAP<STRING, STRING>,
friends ARRAY<STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEM TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE; --指定以文本文件存储

2.读时模式

关系数据库通常使用写时模式(schema on write):在数据写入时检查是否符合schema。

Read More

Hive应用(1.1)数据类型

Hive中除了关系数据库支持的基础数据类型外,还支持3种集合数据类型。

基本数据类型

数据类型 长度 举例
TINYINT 1byte 有符号整数
SMALLINT 2byte 有符号整数
INT 4byte 有符号整数
BIGINT 8byte 有符号整数
BOOLEAN 1byte true/false true
FLOAT 4byte 单精度浮点数
DOUBLE 8byte 双精度浮点数
STRING 变长
TIMESTAMP 整数、浮点、字符串 java.sql.Timestamp兼容格式
BINARY 变长 字节数组

集合数据类型

数据类型 描述 示例
STRUCT 类似于对象。name列中的数据:struct{first STRING, last STRING}可以使用name.first来访问first值 struct(‘John’, ‘Doe’)
MAP 键值对形式,user列的取值可以通过user[‘name’] map(‘name’, ‘Jack’, ‘age’, 18)
ARRAY 数组形式,friends列的取值可以通过friends[0] Array(‘Jack’, ‘tom’)

使用集合类型的一些示例:

1
2
3
4
5
6
7
CREATE TABLE users (
name STRING,
age SMALLINT,
address STRUCT<street:STRING, city:STRING, state:STRING>,
contacts MAP<STRING, STRING>,
friends ARRAY<STRING>
);

Read More

HBase应用(4.3)列族高级配置

1.数据块大小

HBase会索引数据块的起始键,所以数据块越小索引越大,随机查找(性能更强;数据块越大索引越小,能够加载更多的索引数据。默认块大小为64K。

1
create 'test', {NAME => 'cf1', BLOCKSIZE => '65536'}

2.数据块缓存

2.1数据块缓存的内容

HBase的缓存分为两种:MemStore(写缓存) 和 BlockCache(读缓存),BlockCache对随机读取性能提升较为明显。数据块缓存包含以下内容:

  • DataBlock
Read More