3.1 hive简介
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供sql查询功能,可以将sql语句转换为MapReduce任务运行。
优点:
学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用。
缺点:
不能支持实时响应,单条记录的更新操作不能实现,不支持半结构化数据,不支持索引和事务,hive sql比sql有很多制约。
适用:
数据一次写入,多次读,数据无须更新;离线分析。
3.2 hive的安装与配置(hive0.9)
在Hadoop已安装的前提下,我们需要经历以下步骤才能完成hive的安装。
第一步:
(1)在hadoop集群中任选一台安装一个关系型数据库用以存放hive的元数据,可选mysql,oracle,sqlserver等,本集群用的是mysql。
(2)在mysql上建立hive的metadata数据库
172.16.18.191:3306/hive
第二步:
(1)在hdfs上建立hive的数据仓库目录
(2)解压hive0.9到191的任一目录,修改配置文件,修改系统环境变量
(3)启动hiveserver
3.3 hive sql
Create / drop / describe table:
create table ssp_impr_log(id string,cycle_id string,publisher_id string,ad_zone_id string,advertiser_id string,campaign_id string,ad_id string,ad_type string,buy_type string,cost_type string,access_time string,ip string,user_id string,status string,area_code string,matched_area_code string)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
create table ssp_test_result(campaign_id string,record_count int)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
Load data:
load data local inpath '/data/liujun/IMPR_LOG_20130509.txt' into table ssp_impr_log;
Select / insert
insert into table ssp_test_result select t.campaign_id,count(t.id) from ssp_impr_log t group by t.campaign_id;
3.4 hive开发、性能优化
3.4.1 hive开发(和jdbc一样)
//获取连接
Connection conn = HiveOperator.getHiveConnection();
public static Connection getHiveConnection() {
if(conn == null){
try {
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
} catch (ClassNotFoundException e) {
log.error(new Date()+":无法加载数据库驱动");
System.exit(1);
}
try {
conn = DriverManager.getConnection(GenericMethod.getProperties().getProperty("hive.url"), "", "");
} catch (SQLException e) {
log.error(new Date()+":hive连接初始化失败"+GenericMethod.getProperties().getProperty("hive.url"));
}
}
return conn;
}
//创建会话
Statement stmt = conn.createStatement();
//构建sql
String processHql=param.get("incrImprSql");
//执行sql
stmt.execute(processHql);
//关闭连接
stmt.close();
3.4.2 性能优化
(1)创建分区表,select的时候用分区做where条件,缩小结果集从而提升效率,分区表有静态分区和动态分区之别,hive 0.6之前不支持动态分区。其实分区就是分文件夹。但是分区不能过多,分区后每个文件不能过小。
(2)sql 优化
Join是小表在前,大表在后,尽量不用order by等等。
(3)调整数据存储格式
Rcfile 行列存储相结合方式,节省磁盘空间,提高查询响应,但是用按列存储后用sqoop导出到数据库有问题,而且数据加载比较麻烦。
Text file 按行存储文本文件