今天学习了下Hive的知识,作为Hadoop生态圈中的成员,Hive确实简化了数据分析的过程。之前,我们使用MapReduce来分析文件的结果,都要编写Map,Reduce和Job类来得到最终的查询结果。但是有了Hive之后,我们可以非常方便的使用类似关系型数据库的sql语句来查询结构,说道底,在Hive中发起的一个sql查询,也是在调用MapReduce,只不过这些都被封装了起来,我们只需关心怎么去写sql。
在Hive是使用方面,其实很多操作跟关系型数据库oracle很相似。有一些另类的地方,如下所示:
Hive中表的分区
create table book (id bigint, name string) partitioned by (pubdate string) row format delimited fields terminated by ‘t’;
从上面的建表来看,分区字段并不是表里面的字段,而是自己定义的字段。
分区表加载数据
load data local inpath ‘./book.txt’ overwrite into table book partition (pubdate=’2010-08-22′);
另外,对分区表的查询,Hive里面是把分区作为过滤条件来使用,而不是像oracle里面样直接查询分区的内容。
select * from book where pubdate=’2010-08-22′;
2.Hive的数据类型
在Hive里面,定义的数据类型还可以是集合。在创建这种数据类型的时候,需要添加collection items terminated by来标示集合间的分隔符。
create table tab_array(a array<int>,b array<string>)
row format delimited
fields terminated by ‘t’
collection items terminated by ‘,’;
另外,数据的类型还可以是map类型。
create table tab_map(name string,info map<string,string>)
row format delimited
fields terminated by ‘t’
collection items terminated by ‘,’
map keys terminated by ‘:’;
比如,下面这种文件,我们可以把后面一部分当作是Key-Value对,K-V间是以冒号来存储的。
nathon age:18;addr:china
xlt age:19;addr:china
3.与shell的交互
在Hive里面,没有像关系型数据库里面存储过程的概念,很难将所有的sql逻辑都串联起来,因此可以使用shell的方式来执行Hive中的sql语句,将多个逻辑封装在shell脚本里面。
hive -S -e ‘select country,count(*) from tab_ext’