- 什么是Hive? 解决什么问题?
一个构建在Hadoop上的数据仓库框架(表结构),运行SQL语言。
- Hive体系结构
Hive C/S体系结构
- metastore 后台和服务的存储
内嵌本地远程metastore配置
重要的metasrore配置属性
- 表(目录(文件)形式)
- 托管表和外部表
是否在"创建目录“( warehouse directory )下的表。内部表的元数据和数据都由hive管理,外部表Hive不会碰数据,只会删除元数据,可以把创建数据推迟到创建表之后(一般Hive和其他工具来处理同一数据集)。
-- 外部表(External、Location 关键字)
CREATE EXTERNAL TABLE EXTERNAL_TABLE(dummy STRING)
LOCATION '/user/tom/external_table';
- 分区和桶
分区:根据分区列(partition column)的值对表进行(子目录)粗劣划分的机制,加快数据分片的查询速度。
-- 分区(PARTITIONED BY 关键字)
CREATE TABLE logs (ts BIGINT, lines STRING)
PARTITIONED BY (dt STRING, country STRING);
注:加载数据要显示指定分区值。
桶:把表(或分区)进一步组织成桶(bucket),为数据提供额外的结构(子文件)以获得更高效的查询处理(map-side join)和“采样”(sampling)。
-- 划分桶(COLUSTERD BY、SORTED BY 关键字)
CREATE TABLE bucketed_users (id INT,name STRING)
CLUSTERED BY(id) SORTED BY (id ASC) INTO 4 BUCKETS;
--采样(TABLESAMPLE 关键字)
select * from bucketed_users
TABLESAMPLE(BUCKET 1 OUT OF 4 ON ID|rand());
注: hive.enforce.bucketiong 属性设置为True。
- 存储格式
从两个维度对表的存储进行管理,分别是行格式(row format)和文件格式(file format)。
文件格式:SerDe"序列化和反序列化工具”定义,划分为面向行的格式(Avro、SEQUENCEFILE)和面向列的格式(PARQUET、RCFILE、ORCFILE)以及定制的RegexSerDe。
-- 文件格式(STORED AS 关键字)
CREATE TABEL user_parquest STORED AS Avro
AS
SELECT * FROM users;
注:设置为Avro 格式,需要指定hive.exec.compress.output=true; set avro.out.codec=snappy;
行格式:指一行中字段容器的格式。
-- 行格式(ROW FORMAT 关键字)
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; -- 指定文件格式
主:默认存储格式是分隔的文本,每行(line)存储一个数据行(row),默认行内分隔符是ASCII控制码集合中的Control-A,默认集合类元素的分隔符为字符Control-B,默认的映射键(map key)分隔符为字符Control-C。默认格式可以通过hive.default.fileformat属性设置。
- 导入数据
-- 导入文件系统
INSERT OVERWRITE DIRECTORY ...
-- 查询导入表
INSERT OVERWRITE TABLE target SELECT col1,col2 FROM source;
-- 加载导入表
LOAD DATA [LOCAL] INPATH '/user/tom/data.txt' [OVERWRITE] INTO table managed_table;
注:加载操作就是文件系统中文件移动或文件重命名
- 自定义函数
UDF (usr-defined function)
条件: 继承UDF子类,实现evaluate()方法。
package hadoop;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
// 继承 hive.ql.exec.UDF
public class Strip extends UDF {
//创建文本对象
private Text result = new Text();
//重写evaluate方法
public Text evaluate(Text str) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString()));
return result;
}
public Text evaluate(Text str, String stripChars) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString(), stripChars));
return result;
}
}
- UDAF(user-defined aggregate function)
条件:继承UDAF;实现UDAFEvaluator中init()、iterate()、terminatePartial()、merge()、terminater()方法。
UDAF部分结果数据流
package hadoop;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.io.IntWritable;
//继承hive.ql.exec.UDAF类
public class Maximum extends UDAF {
//实现hive.exec.exec.UDAFEValuator静态类
public static class MaximumIntUDAFEvaluator implements UDAFEvaluator {
//创建状态对象
private IntWritable result;
//初始化状态对象
public void init() {
System.err.printf("%s %s\n", hashCode(), "init");
result = null;
}
//迭代更新状态对象
public boolean iterate(IntWritable value) {
System.err.printf("%s %s %s\n", hashCode(), "iterate", value);
if (value == null) {
return true;
}
if (result == null) {
result = new IntWritable(value.get());
} else {
result.set(Math.max(result.get(), value.get()));
}
return true;
}
//部分聚类结果
public IntWritable terminatePartial() {
System.err.printf("%s %s\n", hashCode(), "terminatePartial");
return result;
}
//合并聚类结果
public boolean merge(IntWritable other) {
System.err.printf("%s %s %s\n", hashCode(), "merge", other);
return iterate(other);
}
//最终聚焦结果
public IntWritable terminate() {
System.err.printf("%s %s\n", hashCode(), "terminate");
return result;
}
}
}