Hive基础查询操作教程

327次阅读
没有评论

一、数据导入

1.插入单条数据并查询

新建学生表,具有学号,姓名,班级,身高体重信息,成绩,插入单条数据进行测试。插入复杂类型需要使用select命令转储。查询语句则跟MySQL语语句一致。

语法:insert into <table_name> select <data,map(), array()>

语法:select * from <table_name>;

hive> create table student(

    > num int,

    > name string,

    > class string,

    > body map<string,int>,

    > exam array<string>)

    > row format delimited

    > fields terminated by ‘|’

    > collection items terminated by ‘,’

    > map keys terminated by ‘:’

    > lines terminated by ‘\n’

hive> create table lib(

    > num int,

    > book string)

    > row format delimited

    > fields terminated by ‘|’

    > collection items terminated by ‘,’

    > map keys terminated by ‘:’

    > lines terminated by ‘\n’;

hive> create table price(

    > book string,

    > price int)

    > row format delimited

    > fields terminated by ‘|’

    > collection items terminated by ‘,’

    > map keys terminated by ‘:’

    > lines terminated by ‘\n’;

hive> insert into student (num,name,class,body,exam) select 20200101,’Wlen’,’grade 2′,map(‘height’,175,’weight’,60),array(’80’,’70’);

Hive基础查询操作教程
Hive基础查询操作教程

2.批量导入

在插入数据过程中调用MR操作,效率低下,既Hive的数据通常为Load批量导入。准备数据,数据可以为本地存储,也可以是HDFS上。

数据存储在txt文本中,属性之间以” |”隔开,需要注意的是在创建表时,应设置fields terminated by ‘|’,否则,默认为“,”。由于表中含有复杂数据格式,简单的分隔符通常失去效果。数据如下:

Hive基础查询操作教程

使用Load函数批量导入数据。

hive> load data local inpath ‘/opt/software/student.txt’ into table student;

hive> load data local inpath ‘/opt/software/lib.txt’ into table lib;

hive> load data local inpath ‘/opt/software/price.txt’ into table price;

语法:load data local inpath <address> [overwrite] into table < table_name>;

当数据存储地址为HDFS时,相当于对数据在HDFS上进行迁移。

语法:load data inpath <address> [overwrite] into table <table_name>;

Hive基础查询操作教程
Hive基础查询操作教程

二、select查询

1.简单查询

Hive中的SELECT基础语法和标准SQL语法基本一致,支持WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING、LIMIT、子查询等;在所有的数据库系统中,SELECT语句是使用最多,也最复杂的一块。

语法:SELECT [ALL | DISTINCT] select_expr, select_expr, …

    FROM table_reference

[WHERE where_condition]

[GROUP BY col_list]

[CLUSTER BY col_list

| [DISTRIBUTE BY col_list] [SORT BY col_list]

]

[LIMIT number]

普通查询跟MySQL查询的一模一样。

hive> select * from student;

Hive基础查询操作教程

2.条件查询

1.where语句

Where语句是属于布尔表达式,其后可以与“且”,“或”进行联动进行复杂查询。注意特殊字段的查找方式。

hive> select * from student where class = ‘grade 4’;

hive> select * from student where exam[0] = 96 or exam[1]=77;

hive> select * from student where body[‘height’] = 170;

Hive基础查询操作教程

2. distinct和 all语句

distinct用途为去除重复的项,不加参数则默认为all。distinct参数执行时调用MR进行排序,对大规模数据效率较高。

hive> select class from student;

hive> select distinct class from student;

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

3. group by与having语句

group by是对列进行分组查询,having可以对group by结果进行进一步的过滤。Having与where的区别是,where后面不能写分组函数,而having后面可以使用分组函数。

以下语句首先筛选统计年级总数,然后过滤出2年级以上的同学有多少个。

hive> select class ,count(*) from student group by class;

hive> select class ,count(*) num from student group by class having num >=2;

其中num为存储count(*)的结果。

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

3.limit限制语句与union联合

语法:

Select * from <table_name> limit <up,down>

select UNION [ALL | DISTINCT] select UNION [ALL | DISTINCT] select …

Limit限制查询的说明范围,当大数据查询时,行出过多需要限制查询。union把多个select的结果并集展示出来,可以多表联动。

hive> select * from student limit 2,4;

hive> select class from student union select num from student;

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

4.order by排序与sort by排序

order by为全局排序,后面可以有多列进行排序,默认按字典排序。对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用sort by。以下对成绩进行排序,结果虽然一样。当遇到大规模数据时,sort by可以通过修改reducer个数,为每个reducer产生一个排序文件。每个Reducer内部进行排序,对全局结果集来说不是排序。而order by只调用一个Reducer进行计算。

hive> set mapreduce.job.reduces=3;

hive> select * from student sort by exam[0];

hive> select * from student order by exam[0];

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

5.JOIN多表查询

语法:select <clo> from <table_name> join <table_name> on <table.clo>=< table.clo > join <table_name> on <table.clo>=< table.clo >…

join可以连接多表联合查询,要求查询的条件在连个表中,而且连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。本例有两个表,以为学生表具有学号num,一个图书馆表,具有学号以及借书名称。

hive> select * from student join lib on student.num =lib.num;

查询每个人的借书的名称。

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

hive> select * from student left outer join lib on student.num =lib.num;

左连接,查询每个人的借书的名称。区别是左表的信息都显示,例如:下图中学号20200103与20200106没有借书记录,显示为NULL。

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

hive> select * from student right outer join lib on student.num =lib.num;

与左连接对应的是右连接,右表全部显示。

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

hive> select * from student full outer join lib on student.num =lib.num;    全连接是左右连接的综合使用,显示两张表的所有信息。若没有关联项目则放到最后显示为NULL。

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程

hive> select * from student left semi join lib on student.num =lib.num;

半连接只显示左表内容,即显示跟连接的右表有关系的左表内容。

Hive基础查询操作教程
Hive基础查询操作教程

hive> select * from student join lib on student.num =lib.num join price on lib.book=price.book;

多表(两个以上)查询,例如:查询学生租借的书以及书的价格。大多数情况下,Hive会对每对jion连接对象启动一个MapReduce任务。

Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
Hive基础查询操作教程
到点睡觉了
版权声明:本站原创文章,由 到点睡觉了2022-01-08发表,共计3875字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)