Hive基本查询操作

第1关:where操作

编程要求

查询出工作职责涉及hive的并且工资大于8000的公司名称以及工作经验。(其中库名:db1,表名:table1

student表结构:

INFOTYPE
eduLevel_nameString
company_nameString
jobNameString
salaryint
city_codeint
responsibilityString
workingExpString
select workingExp,company_name from table1 where responsibility like '%hive%' and salary>8000;

第2关:group by操作

编程要求

计算不同工作年限以及其平均工资并且过滤出平均工资大于10000的。(其中库名:db1,表名:table1

table1表结构:

INFOTYPE
eduLevel_nameString
company_nameString
jobNameString
salaryint
city_codeint
responsibilityString
workingExpString
select avg(salary) as avg_salary,workingExp from table1 group by workingExp having avg_salary>10000;

第3关:join操作

知识点

1.内连接:把符合两边连接条件的数据查询出来;

2.左外连接(LEFT OUTER JOIN):左表全部查询出来,右表不符合连接条件的显示为空;

3.右外连接(RIGHT OUTER JOIN):右表全部查询出来,左表不符合连接条件的显示为空;

4.全外连接(FULL OUTER JOIN):左右表符合连接条件和不符合连接条件的都查出来,不符合的显示空;

5.左半开连接(LEFT SEMI JOIN):查询出满足连接条件的左边表记录,需要注意的是selectwhere语句中都不能使用右表的字段。

编程要求

求出表table2中所有城市名的平均工资。(其中库名:db1,表名:table1,表名:table2

table1结构:

INFOTYPE
eduLevel_nameString
company_nameString
jobNameString
salaryint
city_codeint
responsibilityString
workingExpString
select avg(table1.salary),table2.city_name from table2 left outer join table1 on table2.city_code=table1.city_code group by table2.city_name;

第4关:Hive排序

知识点

1.order by:为全局排序;默认按字典排序(desc:降序,asc(默认):升序);需要reduce操作且只有一个reduce;如果指定了hive.mapred.mode=strict(默认值是nonstrict),就必须指定limit来限制输出条数

2.sort by:局部有序

3.distribute by:全局有序;控制map输出结果的分发,相同字段的map输出会发到一个reduce节点去处理;distribute by必须要写在sort by之前

4.cluster  by:被指定的列只能是升序

5.limit:限制查询输出条数

编程要求

查询出2013722日的哪三种股票买入量最多。

表名:total

col_namedata_typecomment
tradedatestring交易日期
tradetimestring交易时间
securityidstring股票ID
bidpx1string买入价
bidsize1int买入量
offerpx1string卖出价
bidsize2int卖出量
select securityid,sum(bidsize1) as s from total where tradedate='20130722' group by securityid order by s desc limit 3;

第5关:Hive数据类型和类型转换

知识点

1.基本数据类型

数据类型所占字节
TINYINT1byte,-128 ~ 127
SMALLINT2byte,-32,768 ~ 32,767
INT4byte,-2,147,483,648 ~ 2,147,483,647
BIGINT8byte,-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
BOOLEAN布尔类型,true或者false
FLOAT4byte单精度
DOUBLE8byte双精度
STRING字符系列。可以指定字符集。可以使用单引号或者双引号
BINARY字节数组
TIMESTAMP时间类型
CHAR
VARCHAR
DATE

2.复杂数据类型

数据类型描述
STRUCT通过“.”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, lastSTRING},那么第1个元素可以通过字段.first来引用。
MAPMAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素
ARRAY数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用

3.类型转换

(1)隐式转换:任何整数类型都可以隐式地转换成一个范围更大的类型

(2)显式转换

--string类型转换为float类型
select * from user where cast(height as float) > 170.0

对于 BINARY 类型的数据,只能将 BINARY 类型的数据转换成 STRING 类型。如果你确信 BINARY 类型数据是一个数字类型(a number),这时候你可以利用嵌套的cast操作,比如a是一个 BINARY,且它是一个数字类型,那么你可以用下面的查询:

SELECT (cast(cast(a as string) as double)) from src;

Date类型数据的有效转换

有效的转换结果
cast(date as date)返回date类型
cast(timestamp as date)timestamp中的年/月/日的值是依赖与当地的时区,结果返回date类型
cast(string as date)如果stringYYYY-MM-DD格式的,则相应的年/月/日的date类型的数据将会返回;但如果string不是YYYY-MM-DD格式的,结果则会返回NULL
cast(date as timestamp)基于当地的时区,生成一个对应date的年/月/日的时间戳值
cast(date as string)date所代表的年/月/日时间将会转换成YYYY-MM-DD的字符串。

编程要求

在右侧编辑器补充代码,2013725日每种股票总共被客户买入了多少元。

表名:total

col_namedata_typecomment
tradedatestring交易日期
tradetimestring交易时间
securityidstring股票ID
bidpx1string买入价
bidsize1int买入量
offerpx1string卖出价
bidsize2int卖出量
select securityid,sum(cast(bidpx1 as float)*bidsize1) from total where tradedate='20130725' group by securityid;

第6关:Hive抽样查询

知识点

1.随机抽样

(1)使用RAND()函数和LIMIT关键字来获取样例数据;

(2)使用DISTRIBUTESORT关键字来保证数据是随机分散到mapperreducer的。

2.桶表抽样

(1)Hive分桶:采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中;

(2)桶表抽样

select * from table_name tablesample(bucket X out of Y on field);
//X:从哪个桶开始抽取  Y:相隔几个桶后再次抽取  field:列名 注意:x的值必须小于等于y的值
//示例:bkt表(总共30个桶)
select * from bkt tablesample(bucket 2 out of 6 on id)
//表示从桶中抽取5(30/6)个bucket数据,从第2个bucket开始抽取,抽取的个数由每个桶中的数据量决定。相隔6个桶再次抽取,因此,依次抽取的桶为:2,8,14,20,26

3.数据块抽样:允许 Hive 随机抽取N行数据,数据总量的百分比(n百分比)或N字节的数据

//抽取table表中50%的数据
SELECT * FROM table TABLESAMPLE (50 PERCENT);
//抽取table表中30m的数据
SELECT * FROM table TABLESAMPLE (30M);
//根据数据行数来取样
SELECT * FROM table TABLESAMPLE (200 ROWS);
//这种方式可以根据行数来取样,但要特别注意:这里指定的行数,是在每个InputSplit中取样的行数,也就是,每个Map中都取样n ROWS。
如果有3个Map Task(InputSplit),每个取200行,总共600行

编程要求

计算每个股票每天的交易量。

  1. 采用桶表抽样的方法(从第二个桶开始抽样,每隔两个开始抽样);

  2. 创建分桶表total_bucket(以股票ID进行分桶);

  3. 数据从total表获取。

表名:total

col_namedata_typecomment
tradedatestring交易日期
tradetimestring交易时间
securityidstring股票ID
bidpx1string买入价
bidsize1int买入量
offerpx1string卖出价
bidsize2int卖出量
create table if not exists total_bucket(
tradedate string,
securityid string,
bidsize1 int,
bidsize2 int
)clustered by(securityid) into 6 buckets
row format delimited fields terminated by ','
stored as textfile;
 
set hive.enforce.bucketing = true;
 
insert overwrite table total_bucket
select tradedate,securityid,bidsize1,bidsize2
from total;
 
select tradedate,securityid,sum(bidsize1+bidsize2) from total_bucket tablesample(bucket 2 out of 2 on securityid) group by tradedate,securityid;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接着上一篇文章,我们来继续学习Hive基本查询操作。 1. 分组查询 分组查询是指将表中的数据按照某个字段进行分组,然后对每个组进行计算,例如求和、计数、平均值等。语法如下: ``` SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name; ``` 其中,aggregate_function可以是COUNT、SUM、AVG等聚合函数。 例如,我们有一个学生表student,包含学生姓名和年龄两个字段,需要按照年龄进行分组,并统计每个年龄段的人数,可以使用如下语句: ``` SELECT age, COUNT(*) as count FROM student GROUP BY age; ``` 2. 排序查询 排序查询是指将表中的数据按照某个字段进行排序,可以是升序或降序。语法如下: ``` SELECT column1, column2, ... FROM table_name ORDER BY column_name ASC|DESC; ``` 其中,ASC表示升序,DESC表示降序。 例如,我们需要按照学生的年龄进行降序排列,可以使用如下语句: ``` SELECT name, age FROM student ORDER BY age DESC; ``` 3. 连接查询 连接查询是指将两个或多个表中的数据按照某个字段进行连接,形成一个新的表。语法如下: ``` SELECT column_name(s) FROM table1 JOIN table2 ON table1.column_name=table2.column_name; ``` 其中,JOIN表示连接操作,ON后面是连接的条件。 例如,我们有两个表student和score,需要按照学生姓名将这两个表连接起来,查询每个学生的成绩,可以使用如下语句: ``` SELECT name, score FROM student JOIN score ON student.id=score.id; ``` 以上就是Hive基本查询操作的介绍,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值