Hadoop权威指南笔记②(Hive)

来源:互联网 发布:ubuntu wine装qq 编辑:程序博客网 时间:2024/05/22 13:38

第十二章 Hive

一、示例

①声明一个表,三列:year,temperature,quality
create table records (year string, temperature int,quality int)
row format delimited #HiveQL所特有,声明每一行是由制表符分隔的文本,按此格式读取数据
fields terminated by ‘\t’
②load data local inpath ‘input/a.txt’
overwrite into table records; #将指定文件放入仓库目录,overwrite:删除原来已存在的所有文件;如果没有,则只会替换同名文件(如果有)
③select year,MAX(temperature) from records where temperature !=99999 and (quality=0 or quality=1) group by year;

普通查询语句group by year:这个查询根据年份分组,然后MAX()聚集函数在每个年分钟查找最高气温。Hive的优势在于把查询转化为一个MR程序,来执行作业,最后把结果打印输出控制台。

日志记录

错误日志可以在本地文件系统的tmp/$user/hive.log中找到Hive的错误日志

二、Hive服务

键入hive –service help可以获得可用服务列表
① cli :Hive的命令行接口
② hiveserver :让hive以Thrift服务器的形式运行;使用Thrift、JDBC、ODBC连接器的客户端需要运行Hive服务器来和Hive进行通信。HIVE_PORT环境变量来指明服务器所监听的端口号(默认10000)
③hwi :Hive的Web接口
④jar :运行类路径中同时包含hadoop和hive类Java应用程序的简便方法
⑤metastore:默认下,metastore和hive服务运行在同一进程里,使用后可以作为单独进程进行。

JDBC驱动

jdbc:hive://host:port/dbname 形式配置JDBC URI,java应用程序可以在指定主机和端口连接另一个进程中运行的Hive服务器

三、Metastore

embedded metastore

metastore是Hive元数据的集中存放地。metastore包括两部分:服务和后台数据的存储,默认运行在同一个JVM,它包含一个内嵌的以本地磁盘作为存储的Derby数据库实例。这称为内嵌metastore配置。只能只有一个内嵌Derby数据库可以访问,只能为一个metastore打开一个hive会话。

local metastore

支持多会话,需要一个独立的数据库,这中配置称本地metastore。metastore服务仍然和hive服务运行在同一个进程中,连接的是另一个进程中的数据库。

remote metastore

一个或多个metastore服务器和hive服务运行在不同的进程内,数据库层可以完全置于防火墙后,客户端则不需要数据用户名和密码,管理安全

四、Hive 分区表

创建一个分区表

create table logs(ts bigint,line string)
partitioned by (dt string,country string)

导入数据,标识分区

load data local inpath ‘input/file.txt’
into table logs
partition (dt=’2001-01’,country=’GB’)
……再导入其他的数据,也要注明分区。这就是一张表在导入数据时,自定义分区。

Hive 分桶

把表分桶:一为了获得更高的查询效率;二是在处理大规模数据集时取样更高效。
create table bucketed_users(id int,name string)
clustered by (id) into 4 buckets
如此,便是使用用户ID来确定如何划分桶:Hive 对值进行哈希并将结果除以桶的个数取余数,任何一个桶里都会有一个随机的用户集合。
关于map端连接:两个表都是以相同的方式划分桶,那么用户ID所在桶id是已知的。那么,处理左边表内某个桶的mapper知道右边表内相匹配的行在对应的桶内,只需获取那个桶链接即可。
向分桶后的表插入成员,将hive.enforce.bucketing属性设置为true:
insert overwrite table bucketed_users
桶对应于MR的输出文件分区:一个作业产生的桶和reduce任务个数相同

五、查询数据

排序和聚集

排序:
①order by对数据进行排序,但是通过只用一个reducer来进行的,对于大规模数据集,这种效率非常低。
②sort by 很多情况下,不需要结果是全局排序的,此时用非标准扩展sort by为每一个reducer产生一个排序文件。
聚集:
控制某个特定行到哪个reducer,为了进行后续的聚集操作这就是distribute by
sort by + distribute by =cluster by

连接

内连接

select sales. * ,thing. * from sales join things on(sales.id=things.id)
连接ID一样的,输出

外连接

可以找到连接表中不能匹配的数据行
left outer join 即使左侧表sales中的有些行无法与所要连接的表任何数据行对应,查询还是会返回这个表的每一数据行。
左连接:(左有右无,右显空)
右连接:(右有左无,左显空)
向哪儿连接以谁为根据
全外连接:full outer join 即两个表中的所有行在输出都有对应的行,没有为空。

半连接

①select * from things where things.id in (select id from sales)
②select * from left semi join sales on(sales.id=things.id)
限制:右表只能在on子句中出现,不能再select中引用右表。

六、用户自定义函数UDF

①继承 org.apache.hadoop.hive.ql.exec.UDF 父类
②至少实现了 evaluate()方法 可以重载,调用时会自己匹配
使用:
add jar /path/a.jar
create temporary function strip as ‘com.hadoop.test.strip’#指定类
select strip(‘context’) from table;

原创粉丝点击