Hive的查询操作(二)

6、分桶及抽样查询

1. 分桶表数据存储

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分。

分桶是将数据集分解成更容易管理的若干部分(若干文件)的另一个技术。

分区针对的是数据的存储路径(目录);分桶针对的是数据文件。

1).先创建分桶表,通过直接导入数据文件的方式

(1)数据准备(替换前面自行创建的student.txt)

(2)创建分桶表

hive (default)> create table stu_buck(id int, name string)

clustered by(id)

into 4 buckets

row format delimited fields terminated by '\t';

注意前面排序中的是cluster by,这里的分桶是clustered by。分桶就是给文件按照哈希值进行分区。分桶一定要走mapreduce。

(3)查看表结构

hive (default)> desc formatted stu_buck;

(4)导入数据到分桶表中

hive (default)> load data local inpath '/export/servers/datas/student.txt' into table stu_buck;

执行出错的看是否需要重新执行一遍。

(5)查看创建的分桶表中是否分成4个桶,如图所示

发现并没有分成4个桶。是什么原因呢?

2).创建分桶表时,数据通过子查询的方式导入

(1)先建一个普通的stu表

hive (default)> create table stu(id int, name string) row format delimited fields terminated by '\t';

(2)向普通的stu表中导入数据

hive (default)> load data local inpath '/export/servers/datas/student.txt' into table stu;

(3)清空stu_buck表中数据

hive (default)> truncate table stu_buck;

hive (default)> select * from stu_buck;

(4)导入数据到分桶表,通过子查询的方式

hive (default)> insert into table stu_buck select id, name from stu;

(5)发现还是只有一个分桶,如图所示

注意:分桶是按照某一个字段把数据分区,走一遍mapreduce。一定要走一遍mapreduce。这里直接上传数据没有走mapreduce,所以是不会分桶的。所以需要通过查询的方式把数据导入进去。

(6)需要设置一个属性

hive (default)> set hive.enforce.bucketing=true; # 强制分桶

hive (default)> set mapreduce.job.reduces=-1; # 自动划分reducer个数

hive (default)> insert into table stu_buck select id, name from stu;

注意数据量太少了,默认是不会分桶的,所以这里设置强制分桶。另外之前设置的reducer是3,但是3个reducer分不了4个桶。

(7)查询分桶的数据

hive (default)> select * from stu_buck;

        注意:这个和原来的数据是有区别的。这里需要依赖不同的id分到不同的文件。这里总共4个桶。每4个记录为1个桶。注意id为1、2、3、4分别分到不同的桶;id为5、6、7、8分别分到不同的桶。(简单理解就是哈希值模4出现的)。显示的顺序是按照文件的顺序显示的。

分桶规则:

        根据结果可知:Hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中

2. 分桶抽样查询

        对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive可以通过对表进行抽样来满足这个需求。

        一个桶的数据,就是整体数据集的简单抽样。

        希望了解整体水的分布,则需要隔一段水位打一点水。

分桶后可以进行抽样查询,查询表stu_buck中的数据。

hive (default)> select * from stu_buck tablesample(bucket 1 out of 4 on id);

就是从4桶中取出1桶。

        注:tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y) 。

        y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了4份,当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8=)1/2个bucket的数据。

        x表示从哪个bucket开始抽取,如果需要取多个分区,以后的分区号为当前分区号加上y。例如,table总bucket数为4,tablesample(bucket 1 out of 2),表示总共抽取(4/2=)2个bucket的数据,抽取第1(x)个和第3(x+y)个bucket的数据。

        注意:x的值必须小于等于y的值,否则

        FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck

取前2桶。

hive (default)> select * from stu_buck tablesample(bucket 1 out of 2 on id);

取半桶。

hive (default)> select * from stu_buck tablesample(bucket 1 out of 8 on id);

根据分桶可以进行抽样调查,可以对数据集有一个整体的把握。

抽样的事情一定要抽有代表性的才行。

正常来说,分区用的比较多;分桶用的不太多。

7、其他常用查询函数

1. 空字段赋值

1).函数说明

NVL:给值为NULL的数据赋值,它的格式是NVL( value,default_value)。它的功能是如果value为NULL,则NVL函数返回default_value的值,否则返回value的值,如果两个参数都为NULL ,则返回NULL。

2).数据准备:采用员工表

3).查询:如果员工的comm为NULL,则用-1代替

hive (default)> select comm,nvl(comm, -1) from emp;

留意这里的-1值原本应该是NULL的,但是NULL将来在处理数据的时候,可能会出问题。另外使用0代替也是不合适的,0表示这个职位有奖金的奖励,然而没有得到奖金;NULL表示这个职位没有奖金这个功能。

4).查询:如果员工的comm为NULL,则用领导id代替

hive (default)> select comm, nvl(comm,mgr) from emp;

2. CASE WHEN

CASE WHEN实际上就是if else。

1). 数据准备

name

dept_id

sex

悟空

A

大海

A

宋宋

B

凤姐

A

婷姐

B

婷婷

B

2).需求

求出不同部门男女各多少人。结果如下:

A     2       1

B     1       2

3).创建本地emp_sex.txt,导入数据

[root@hadoop101 datas]# vi emp_sex.txt

悟空 A 男

大海 A 男

宋宋 B 男

凤姐 A 女

婷姐 B 女

婷婷 B 女

4).创建hive表并导入数据

hive (default)> create table emp_sex(

name string,

dept_id string,

sex string)

row format delimited fields terminated by "\t";

hive (default)> load data local inpath '/export/servers/datas/emp_sex.txt' into table emp_sex;

6).简单测试一下case when的功能。

hive (default)> select *, case sex when '男' then 1 else 0 end

from emp_sex

这里判断sex是否为男,是男的则为1,不是男的则为0。

6).按需求查询数据

hive (default)> select

  dept_id,

  sum(case sex when '男' then 1 else 0 end) male_count,

  sum(case sex when '女' then 1 else 0 end) female_count

from

  emp_sex

group by

  dept_id;

这里要进行mapreduce操作。

3. 行转列

行转列是指把多行转成集合

1).相关函数说明

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

2).数据准备

name

constellation

blood_type

孙悟空

白羊座

A

大海

射手座

A

宋宋

白羊座

B

猪八戒

白羊座

A

凤姐

射手座

A

3).需求

把星座和血型一样的人归类到一起。结果如下:

射手座,A            大海|凤姐

白羊座,A            孙悟空|猪八戒

白羊座,B            宋宋

4).创建本地constellation.txt,导入数据

[root@hadoop101 datas]# vi constellation.txt

孙悟空 白羊座 A

大海 射手座 A

宋宋 白羊座 B

猪八戒 白羊座 A

凤姐 射手座 A

5).创建hive表并导入数据

hive (default)> create table person_info(

name string,

constellation string,

blood_type string)

row format delimited fields terminated by "\t";

hive (default)> load data local inpath "/export/servers/datas/constellation.txt" into table person_info;

6).按需求查询数据

首先,把星座和血型拼接在一起。

    select

        name,

        concat(constellation, ",", blood_type) base

    from

        person_info;

执行的结果是:

然后,留意名字是多行的,现在需要把多行的数据拼接在一起变成单行的数据。使用collect_set()。可以把一组的某一列收集为一个集合。

hive (default)> select

    t1.base,

    collect_set(t1.name)

from

    (select

        name,

        concat(constellation, ",", blood_type) base

    from

        person_info) t1

group by

    t1.base;

实际上这样已经差不多了。但collect_set()的结果是集合,上面要求的是拼成一串,所以再加上concat_ws()。

hive (default)> select

    t1.base,

    concat_ws('|', collect_set(t1.name)) name

from

    (select

        name,

        concat(constellation, ",", blood_type) base

    from

        person_info) t1

group by

    t1.base;

这里要进行mapreduce操作。

这里最重要的是 collect_set()。这是一个聚合函数,把几行拼接在一起,称为行转列。

4. 列转行

行转列是把多行转成集合,列转行就是把集合转成多行。

1).函数说明

EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。

LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2).数据准备

movie

category

《疑犯追踪》

悬疑,动作,科幻,剧情

《Lie to me》

悬疑,警匪,动作,心理,剧情

《战狼2》

战争,动作,灾难

3).需求

将电影分类中的数组数据展开。结果如下:

《疑犯追踪》 悬疑

《疑犯追踪》 动作

《疑犯追踪》 科幻

《疑犯追踪》 剧情

《Lie to me》 悬疑

《Lie to me》 警匪

《Lie to me》 动作

《Lie to me》 心理

《Lie to me》 剧情

《战狼2》 战争

《战狼2》 动作

《战狼2》 灾难

4).创建本地movie.txt,导入数据

[root@hadoop101 datas]# vi movie.txt

《疑犯追踪》 悬疑,动作,科幻,剧情

《Lie to me》 悬疑,警匪,动作,心理,剧情

《战狼2》 战争,动作,灾难

5).创建hive表并导入数据

hive (default)> create table movie_info(

    movie string,

    category array<string>)

row format delimited fields terminated by "\t"

collection items terminated by ",";

hive (default)> load data local inpath "/export/servers/datas/movie.txt" into table movie_info;

6).按需求查询数据

首先,这样写是可以的:

hive (default)> select

    explode(category)

from

    movie_info;

运行效果待截图

但是在select中加上movie性质就变了。

hive (default)> select

    movie,

    explode(category)

from

    movie_info;

这样是不行的。因为explode(category)是一行好几个,movie是一行只有一个,行对不上。

此时可以使用lateral view。表示侧视图。lateral view后面跟一个udtf函数(就是一对多),再起一个table别名。后面再as一个列别名。

LATERAL VIEW udtf(expression) tableAlias AS columnAlias

查询语句修改如下:

hive (default)> select

    movie,

    category_name

from

    movie_info

lateral view

    explode(category) table_tmp as category_name;

        

        注意movie字段是从movie_info来的,category_name字段是从table_tmp来的。查询语句可以调整为:

hive (default)> select

    m.movie,

    table_tmp.category_name

from

    movie_info m

lateral view

    explode(category) table_tmp as category_name;

貌似MySQL中没有这样的写法。

假设我拿到的数据是这样

《疑犯追踪》 悬疑,动作,科幻,剧情

《Lie to me》 悬疑,警匪,动作,心理,剧情

《战狼2》 战争,动作,灾难

现在想看看悬疑的电影有哪些。则需要按照“悬疑”重新聚合。按照我们想要的视角重新聚合数据。

hive (default)> from

(select

    m.movie,

    table_tmp.category_name

from

    movie_info m

lateral view

    explode(category) table_tmp as category_name) t

select

    categories,

    concat_ws(",", collect_set(movie)) movies

group by

    categories;

运行效果待截图

5. 窗口函数(开窗函数)

1).相关函数说明

OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。

CURRENT ROW:当前行

n PRECEDING:往前n行数据

n FOLLOWING:往后n行数据

UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点

LAG(col,n,default_val):往前第n行数据

LEAD(col,n, default_val):往后第n行数据

NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

2).数据准备:name,orderdate,cost

jack,2021-01-01,10

tony,2021-01-02,15

jack,2021-02-03,23

tony,2021-01-04,29

jack,2021-01-05,46

jack,2021-04-06,42

tony,2021-01-07,50

jack,2021-01-08,55

mart,2021-04-08,62

mart,2021-04-09,68

neil,2021-05-10,12

mart,2021-04-11,75

neil,2021-06-12,80

mart,2021-04-13,94

3).需求

(1)查询在2021年4月份购买过的顾客及总人数

(2)查询顾客的购买明细及月购买总额

(3)上述的场景, 将每个顾客的cost按照日期进行累加

(4)查询每个顾客上次的购买时间

(5)查询前20%时间的订单信息

4).创建本地business.txt,导入数据

[root@hadoop101 datas]# vi business.txt

jack,2021-01-01,10

tony,2021-01-02,15

jack,2021-02-03,23

tony,2021-01-04,29

jack,2021-01-05,46

jack,2021-04-06,42

tony,2021-01-07,50

jack,2021-01-08,55

mart,2021-04-08,62

mart,2021-04-09,68

neil,2021-05-10,12

mart,2021-04-11,75

neil,2021-06-12,80

mart,2021-04-13,94

5).创建hive表并导入数据

hive (default)> create table business(

name string,

orderdate string,

cost int

) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

hive (default)> load data local inpath "/export/servers/datas/business.txt" into table business;

6.按需求查询数据

(1)查询在2021年4月份购买过的顾客及总人数

hive (default)> select *

from business

where substring(orderdate,1,7)='2021-04';

运行效果待截图

这个是2021年4月份购买过的人。结果是1个mart和4个jack。因为有重复的,需要去重,使用group by。

hive (default)> select name

from business

where substring(orderdate,1,7)='2021-04'

group by name;

运行效果待截图。

现在结果只有1个mart和1个jack。注意去重的话小数据量可以大数据量需谨慎。

hive (default)> select count(distinct(name))

from business

where substring(orderdate,1,7)='2021-04'

运行效果待截图。

结果是2。

查顾客和查总人数分开查都可以,可以现在要求写在一张表中。因为一个查询是两个结果,一个查询是一个结果,直接拼在一起是不行的。我们想要拼接成:

mart

2

jack

2

因为要统计总人数,所以使用count()。对于mart来说,count整个范围内的数据,所以在count后面进行开窗操作。count(*)  over()。

hive (default)> select distinct(name),count(*) over ()

from business

where substring(orderdate,1,7) = '2021-04'

group by name;

这里要进行mapreduce操作。

这里添加的一列count(*) over()。一定要在不加这列的情况下执行完了,才执行窗口函数。窗口函数是在整表上数一下有多少个。

over()是表示“在…上”,这里的意思就是“在整表上”count(*)。

对于第1行来说,是在整表上count(*),对于第2行来说,也是在整表上count(*)。

(2)查询顾客的购买明细及月购买总额

先来看购买明细和月购买总额。

hive (default)> select *

from business;

这个简单。问题是月购买总额怎么弄。

hive (default)> select *, sum(cost) over(partition by month(orderdate))

from business;

这里要进行mapreduce操作。

留意这里的sum(),是以月分区的基础上求组合。留意分区及组合。

第1~6个结果是1月,组合是10+55+50+46+29+15=205。

第7个结果是2月,组合是23。

第8~12个结果是4月,组合是94+42+75+68+62=341。

第13个结果是5月,组合是12。

第14个结果是6月,组合是80。

注意总额sum()不是在整表上求,而是按每个月进行分区来求。因为窗口是按月分的区。

如果要查询每个顾客每个月买了多少,则修改为:

hive (default)> select *, sum(cost) over(partition by name, month(orderdate))

from business;

则同时按人名和月进行开窗操作。

运行效果待截图

(3)上述的场景, 将每个顾客的cost按照日期进行累加

所谓的累加,比如:买了5天。第1天10元,第2天20元,第3天30元,第4天40元,第5天50元。则应该有如下结果:

第几天

购买金额

累加金额

1

10

10

2

20

30

3

30

60

4

40

100

5

50

150

注意,按日期进行累加的隐含条件是按日期排序。不然没法累加。

hive (default)> select *, 

sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row) 

from business;

        这里所谓的UNBOUNDED PRECEDING是指到前面的起点,UNBOUNDED FOLLOWING是指到后面的终点。 

        可以看到,首先结果是按名字分区了;其次区内按日期排好序了。而求sum()则是从本分区第1行到当前行。

下面可以完整的看到over()中写不同参数的时候分别对应什么样的结果。

hive (default)> select *,

sum(cost) over() as sample1,--所有行相加

sum(cost) over(partition by name) as sample2,--按name分组,组内数据相加

sum(cost) over(partition by name order by orderdate) as sample3,--按name分组,组内数据累加

sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4,--和sample3一样,由起点到当前行的聚合

sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合

sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--当前行和前边一行及后面一行

sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行

from business;

rows必须跟在Order by 子句之后,对排序的结果进行限制,使用固定的行数来限制分区中的数据行数量

比如,查看某顾客从上一次到下一次加起来总共花了多少钱。(当然这个实际意义不大,只是练习一下)。

hive (default)> select *, 

sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and 1 FOLLOWING) 

from business;

        总结来说,就是我们要执行一个聚合(sum(cost)),要对一个范围内的东西进行聚合,这个范围就是操作窗口。over()就是描述操作窗口的范围:按照name进行分区,然后按orderdate排序,然后窗口的范围是rows between ...。

        PS. 注意这里运行的都是1个map和1个reduce。这里的分区其实是通过分组实现的。与mapreduce中的分区是两码事。

(4)查看顾客上次的购买时间

hive (default)> select *,

lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1,

lag(orderdate,2) over (partition by name order by orderdate) as time2

from business;

(5)查询前20%时间的订单信息

先把数据分为5组,每组20%。

hive (default)> select *, ntile(5) over(order by orderdate)

from business;

ntile(n)表示把数据分为n组,返回第几组。

现在要取前20%,就是取第1组。虽然很想写having。

hive (default)> select *, ntile(5) over(order by orderdate) sorted

from business

having sorted = 1;

但是不行。

因为窗口函数的执行时机,几乎在最后。就是要执行完select、from、where、having再执行窗口函数。所以只能进行子查询。

hive (default)> select * from (

    select *, ntile(5) over(order by orderdate) sorted

    from business

) t

where sorted = 1;

PS. 简单给窗口函数做个总结:

在做聚合操作的时候加个窗口。比如count()、sum()的时候,指定一个操作的窗口。窗口函数的执行时机基本上是在最后。(除了order by和limit,比如有全局排序,那么窗口函数就在全局排序之前执行)

hive (default)> select *,

rank() over(partition by subject order by score desc) rank

from score

order by score;

注意最后的结果是按照成绩排序,但是有rank这一列,当然rank的顺序已经乱了。尽管乱了,还是忠实的标记出是这个学科的第几名。

注意运行的结果出现了两次mapreduce。第一次是窗口,第二次是orderby。

注意第一行的4,表示“大海”的数学是排名第4。所以是先按照顺序列出来了,再按照成绩排序。

每多一个窗口,就会多一个mapreduce,除非开的窗口是一样的。

hive (default)> select *,

rank() over(partition by subject order by score desc) rp,

dense_rank() over(partition by subject order by score desc) drp,

row_number() over(partition by subject order by score desc) rmp

from score;

这里的三个窗口时一模一样的,所以一个mapreduce就搞定了。可以使用explain看一下。

hive (default)> explain select *,

rank() over(partition by subject order by score desc) rp,

dense_rank() over(partition by subject order by score desc) drp,

row_number() over(partition by subject order by score desc) rmp

from score;

先执行了Map Reduce,再从mapreduce中执行了Fetch。

如果三个窗口都不一样的,比如:

hive (default)> explain select *,

rank() over(partition by subject order by score desc) rp,

dense_rank() over(partition by name order by subject desc) drp,

row_number() over(partition by score order by name desc) rmp

from score;

共4步,前3步都是Map Reduce。最后一步是fetch。

所以是,每开一个窗口,对应一个不同的Map Reduce。

6. Rank

1).函数说明

RANK() 排序相同时会重复,总数不会变

DENSE_RANK() 排序相同时会重复,总数会减少

ROW_NUMBER() 会根据顺序计算

2).数据准备

name

subject

score

孙悟空

语文

87

孙悟空

数学

95

孙悟空

英语

68

大海

语文

94

大海

数学

56

大海

英语

84

宋宋

语文

64

宋宋

数学

86

宋宋

英语

84

婷婷

语文

65

婷婷

数学

85

婷婷

英语

78

这里是4个人,每人考了3科,总共12条数据。

3).需求

计算每门学科成绩排名。

4).创建本地score.txt,导入数据

[root@hadoop101 datas]# vi score.txt

孙悟空 语文 87

孙悟空 数学 95

孙悟空 英语 68

大海 语文 94

大海 数学 56

大海 英语 84

宋宋 语文 64

宋宋 数学 86

宋宋 英语 84

婷婷 语文 65

婷婷 数学 85

婷婷 英语 78

5).创建hive表并导入数据

hive (default)> create table score(

name string,

subject string,

score int)

row format delimited fields terminated by "\t";

hive (default)> load data local inpath '/export/servers/datas/score.txt' into table score;

6.按需求查询数据

hive (default)> select *,

rank() over(partition by subject order by score desc) rp,

dense_rank() over(partition by subject order by score desc) drp,

row_number() over(partition by subject order by score desc) rmp

from score;

        对于RANK()和DENSE_RANK(),留意“宋宋-英语-84”和“大海-英语-84”的排名都是1,对于下一个“婷婷-英语-78”,RANK()为3,DENSE_RANK()为2。而ROW_NUMBER()则不会重复。

        扩展:求出每门学科前三名的学生?

加个子查询就可以了。

from () t

select *,

where rank <= 3;

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Hive是一个大数据分析的开源平台,它提供了很多的综合应用案例,其中之一是用户学历查询。用户学历查询案例中,我们可以使用Hive从数据仓库中读取关于用户的数据,然后通过分析和聚合这些数据,来确定用户的学历信息。在这个过程中,Hive提供了强大的SQL语句支持,以及丰富的函数库,可以满足各种复杂的分析需求。 ### 回答2: 近日,一家大型人力资源公司因为工作中频繁查询员工学历信息而决定使用hive技术来进行数据的处理和分析,通过hive的综合应用,实现了更加高效便捷的用户学历查询。 此次项目中,该公司首先进行了数据清洗和处理,将员工学历相关信息从不同的数据源中收集并整合,统一存储在hive的数据仓库中。接着,通过hiveQL语言对数据进行查询和筛选,实现了仅需几秒钟即可得到用户学历信息的目标。使用hive的好处是能够快速处理海量数据,提高查询效率,同时还能实现数据分析和统计,并可视化展示数据结果。 在具体的操作中,该公司将原始数据进行拆分和转换,把不同的表进行组合和分析。同时,在处理数据过程中还运用了一些hadoop生态体系的其他组件,比如pig和spark等工具,以提高效率和处理这些数据所需的时间。在处理完成之后,用户可以通过hive对用户的学历进行查询,根据自己的需要,可以根据职位、学历、工作年限等限定条件来查询,大大地提高了查询精度,也让招聘和人事等相关部门的工作变得更加轻松便捷。 总的来说,该项目成功运用了hive技术,实现了用户学历查询的目标,提升了工作效率和数据查询的准确度。而且此次项目的经验和教训也可以为其他公司和企业在hive技术的运用方面提供借鉴和参考。 ### 回答3: HiveHadoop生态系统中的一项重要技术,它是基于Hadoop的MapReduce框架的数据仓库解决方案,可以进行大规模数据的存储和处理。而学历查询是一个典型的数据查询场景,由于学历查询需要对大量的数据进行快速高效的查询和分析,因此使用Hive进行学历查询可以大大提高查询效率和数据处理能力。 以学历查询为例,如果我们需要查询某个区域内所有人的学历情况,我们需要从海量的数据中筛选出相关的信息,然后进行分析和统计,这个过程需要耗费大量的时间和精力。但是如果使用Hive,我们可以通过Hive的SQL查询语句来快速实现数据查询和分析。 具体来说,如果我们要查询一个城市的所有居民的学历情况,首先要准备好相应的数据表或数据集,然后利用Hive的相关命令将数据导入到Hive表中。在数据导入完成后,我们可以使用类似于SQL的语句来实现查询。例如,我们可以使用Hive的SELECT语句和GROUP BY语句来实现按学历等级进行分组并统计各组的人数。 当然,如果需要更加复杂的查询和分析任务,我们也可以使用Hive进行更多的数据处理和计算任务。例如,Hive支持使用自定义的UDF函数,可以对数据实现更加灵活和精细化的处理。 总而言之,Hive作为一种分布式数据存储和查询解决方案,可以为学历查询等数据处理场景提供快速、高效和可扩展的解决方案。通过合理的数据分析和查询,可以帮助我们更好地了解数据背后的真相,为业务决策提供更多有效的参考和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Distantfbc

你的鼓励是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值