Hadoop组件之Hive
Hive 是一个构建在Hadoop上的数据仓库框架,是应Facebook每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展。Hive设计的目的是让精通sql技能但java 编程技能相对较弱的分析师能够对Facebook存放在HDFS中的大规模数据集执行查询。
Hive简介
Hive提供了基于SQL的接口,即Hive查询语言(HiveQL),能够将查询语言转换成Java MapReduce代码,并在集群上运行。如图:
数据库: 命名空间将数据将表与其它数据单元分离开来,防止命名冲突;
表: 组织具有相同结构的记录集合; 分区: 可选部分,分区是基于特定属性分类给定信息的数据的逻辑隔离;
桶或集群: 与分区相似,但是用哈希函数来分离数据;
分区和桶: 用来提高性能使得数据更易管理。
Hive 架构
如图所示,Hive 由APIs, 用户接口, 服务器, 作业, task trackers, 和JDBC 驱动器等组件组成。
如下是访问Hive的不同方式:
Hive 命令行接口(CLI)
Hive Web 接口
Hive 服务器
JDBC/ODBC
Hive元存储是一个数据库,该数据库存储着与数据库,表,列,数据类型以及在HDFS中的位置的所有相关元数据。
Hive的数据类型
Hive支持原生数据类型,包括数值型,字符串类型,布尔型,以及二进制类型,如图。它也支持复杂数据类型,包括数组,键值,结构体以及联接。
Hive 内建操作符
关系型操作符:
这些操作符用来建立两个实体时间的比较关系,两个实体各据操作符一边,示例如下: X=Y, X!=Y, X>=Y, X IS NULL, X LIKE Y, X RLIKE Y等。
算数运算符: 这类操作符用来做一些数学运算,例如: X+Y, X-Y, XY, X/Y, X&Y, X|Y, X^Y, X 等.
逻辑运算符: Hive中支持的逻辑运算符示例如下: X AND Y / X && Y, X OR Y / X
Hive 内建函数
Hive常用的命令
创建表,t作为列的分隔符:
create table tradedetail (id bigint,income double,expenses double,time string) row formate delimited fields terminated by 't';
create table userinfo(id bigint, account string, name string, age int) row format delimited fields terminated by 't';
在创建表的的同时进行赋值:
create table result row format delimited fields terminated by 't' as select t1.account, t1.income, t1.expenses, t1.surplus, t2.name from userinfo t2 join (select account, sum(income) as income, sum(expenses) as expenses, sum(income-expenses) as surplus from trade detail group by account) t1 on(t1.account = t2.account);
加载本地文件到数据表中:
load data local inpath '/home/hadoop/data/student.txt' overwrite into table student;
load data local inpath '/home/hadoop/data/userinfo.doc' overwrite into table user info;
创建外部表 ,创建外部表的一般情况指的是:先有文件存放着数据,之后我们再来创建表,也就是说创建一张表,然后指向这个有数据的目录。以后只要是向这个目录中上传符合格式的数据会被自动装在到数据库表中,因为在metastore(元数据)会记录这些信息:
create external table tdetail(id bigint, account string, income double, expenses double, time string) ) row format delimited fields terminated by 't' location '/hive/td partition';
创建分区表,一般用于数据量比较大的情况下, partitioned by (logdate string)用来指定按照什么进行分区:
create external table tdetail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by 't' location '/hive/td partition' partitioned by (logdate string);
将mysql中的数据直接保存到Hive中:
sqoop export –connect jdbc:mysql://192.168.8.103:3306/hmbbs –username root –password hadoop –export-dir '/user/hive/warehouse/pv2013 0531/000000 0' –table pv
基本的插入语法:
insert overwrite table tablename partiton(partcol1=val1,partclo2=val2) selectstatement from t statement
insert overwrite table testinsert select from test table;
更新表的名称:
hive> alter table source RENAME TO target;
添加新一列:
alter table invites add columns (newcol2 INT COMMENT 'a comment');
删除表:
DROP TABLE records;
删除表中数据,但要保持表的结构定义:
dfs -rmr /user/hive/warehouse/records;
显示所有函数:
show functions;
查看函数用法:
describe function substr;
内连接:
SELECT <col1>, <col2> FROM <table1> t1 JOIN <table2> t2 ON (<condition>);
右外连接:
SELECT <col1>, <col2> FROM <table1> RIGHT OUTER JOIN <table2> ON <cond.>;
左外连接:
SELECT <col1>, <col2> FROM <table1> LEFT OUTER JOIN <table2> ON <cond.>;
全外连接:
SELECT <col1>, <col2> FROM <table1> FULL OUTER JOIN <table2> ON (<condition>);
交叉连接:
SELECT FROM <table1> JOIN <table2>;
创建视图:
hive> CREATE VIEW validrecords AS SELECT FROM records2 WHERE temperature !=9999;
查看视图详细信息:
hive> DESCRIBE EXTENDED validrecords;
Hive的特点
Hive 提供了一个基于SQL的接口, 称作Hive查询语言或HiveQL, 能够将查询语句转换成Java MapReduce代码,并在Hadoop集群中运行;Hive 不支持在数据库表中执行行插入和更新;Hadoop借助对数据存储和处理的高容忍特性在分布式结构上实现了大量扩展性。Hive 是个数据仓库工具—它获取的大部分数据都是结构化的并且存储在扁平化文件中或者类似 Teradata 或nformatica这样的工具中。
ALTER TABLE 命令可以用来: 修改表名 ;
修改列簇 ;
增添新列 ;
删除一些列;
更改表的某些属性 ;
增加新的分区 。
HiveQL 查询
使用Hive语句操作数据库时,速度较慢,尤其是在上100G的数据中做查询操作时耗时耗资源,1T以上的数据查询就更慢了,但我们要了解HiveQL做查询时的语法。
HiveQL 查询最常见的类型是SELECT语句,除了SELECT语句之外,另一个重要的HiveQL 查询是条件限制查询,嵌套查询, CASE…WHEN…THEN 查询, LIKE和RLIKE 查询, GROUP BY 查询等。他的语法结构与Mysql的语法结构十分类似。
Select 语句:
SELECT <column1>, <column2> FROM <tablename>;
从列中查询给定字符串开头的记录:
SELECT string FROM <tablename>;
限制条件查询:
SELECT FROM <tablename> limit 10;
嵌套查询:
SELECT FROM <tablename> where <condition> <compares> (SELECT <column> FROM <table name>);
CASE…WHEN…THEN 查询:
SELECT <column1>, CASE WHEN <condition1> THEN <option1>, WHEN <condition2> THEN <option2>, ELSE <option3> END AS <column2> FROM <tablename>;
LIKE 和 RLIKE 模糊查询:
SELECT FROM <tablename> WHERE <column1> LIKE ‘%string%’; SELECT FROM <tablename> WHERE <column2> RLIKE ‘.(string) .’;
GROUP BY 查询:
SELECT <column1>, <column2> FROM <tablename> GROUP BY <column1>;
HAVING 查询:
SELECT <column1>, <column2> FROM <tablename> GROUP BY <column1> HAVING <column1=value1> OR <column1=value2>;
还可以使用自定义函数操作数据库,此处就不给出了。
性能调试和查询优化
调试和优化Hive查询语句需要理解Hive查询是如何工作的,想要知道Hive查询是如何工作,需要使用EXPLAIN命令。通常, EXPLAIN命令的输出包含3部分。
Hive安全机制
谈到Hive的安全机制时,首先要提到两个概念: 验证与授权。
参数hive.files.umask.value 的值决定了新建条目的默认权限,而参数 hive.metastore.authorization.storage.checks 值为真时,则判断用户是否有在 Hive中删除表格的权限. 同样地,也可以在Hive中授权. 下图是相应的权限:
至此,Hadoop组件之Hive中简单基本的问题就介绍完了,我的个人感觉是Hive提供的对数据操作的方式简单,降低了学习Hadoop的成本,但不足是不能对数据进行实时查询,当然有其他的Hadoop组件来完成改工作了。这点我们后面慢慢说。