第17 章 关于 Hive

  1. 什么是Hive? 解决什么问题?

一个构建在Hadoop上的数据仓库框架(表结构),运行SQL语言

  1. Hive体系结构

hive体系结构

Hive C/S体系结构
  1. metastore 后台和服务的存储

内嵌本地远程metastore配置

内嵌本地远程metastore配置

重要的metasrore配置属性
重要的metasrore配置属性

  1. 表(目录(文件)形式)
  • 托管表和外部表

是否在"创建目录“( 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;

注:加载操作就是文件系统中文件移动或文件重命名

  1. 自定义函数

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部分结果数据流

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;
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值