Hive SQL 练习(这个秒退是怎么回事啊?写了半天 东西都没了,瞬间整个人都凌乱了)

首先将练习用的两张表 上传到hdfs上
命令如下:
hadoop fs -put /opt/dep.txt /dep.txt
hadoop fs -put /opt/employee.txt /employee.txt

然后开始写练习

创建数据库
create database bs17;
use bs17;
创建员工信息表
create table employee(
emp_id string
,emp_name string
,status string
,salary string
,status_salary string
,in_work_date string
,leader_id string
,dep_id string
)row format delimited
fields terminated by '\t'

row format delimited fileds terminated by '\t' 表示将传进来的文件按照空格分割 写入到表格中

闯入文件 employee.txt
load data inpath '/employee.txt' overwrite into table employee;

查询表
select * from employee;

同理创建第二个表
create table department(
dep_id string
,dep_name string
,address string
)row format delimited
fields terminated by '\t'
传入文件 以空格分割写入到表格中
load data inpath '/dep.txt'overwrite into table department;
查询表
select * from department
之前的创建表 都是采用string字段 这样做的原因是防止传入的数据损失精度失真 以原文件的格式类型为准 txt 通用 string
接下来通过 as 来更改表结构 将字段改为所需要的
create table dw_employee as select
cast(emp_id as int) emp_id
,emp_name
,status
,cast(salary as double)salary
,cast(status_salary as double)status_salary
,cast(in_work_date as date)in_work_date
,cast(leader_id as int)leader_id
,cast(dep_id as int)dep_id
from employee

dw_employee 为创建好的更改好字段的表
select * from dw_employee
查询表结构语句
describe formatted dw_employee
同理更改第二张表的表结构
create table dw_department as
select cast(dep_id as int)dep_id
,dep_name
,address
from department

select * from dw_department
除了 通过 as 复制表 之外 还可以通过 like 来克隆 不过 like 克隆的只有表结构 没有数据
create table employee_clone like employee;
select * from employee_clone

查找employee 表中的 id name 月薪 季薪 年薪
select emp_id
,emp_name
,salary mon_salary
,salary*3 season_salary
,salary*12 year_salary
from dw_employee
查找员工的月工资 月薪加奖金
select emp_id
,emp_name
,salary+status_salary getMoney
from dw_employee
插入数据 id name 其他为null
insert into dw_employee(emp_id,emp_name) values(1111,'aaaa')
nvl 表示条件 如果有字段信息 则表示字段信息 如果为null 则用后的表示
如有职位 则表示 没有则用普通员工代替
如果有入职日期 则表示 没有 则用2015-5-1表示
select emp_id
,emp_name
,nvl(status,'普通员工') job
,nvl(in_work_date,'2015-5-1') in_work_date
from dw_employee

复制员工表,表名为emp_copy
create table emp_copy as select * from dw_employee
机构中有多少种职位(就是将所有的status 聚合展示出来 展示出来几种就有几种)
select distinct status from dw_employee

薪水高于6000的员工

select * from dw_employee where salary>6000

职位是analyst 的员工

select * from dw_employee where status ='analyst'

以小写格式展示职位信息(lower())
select emp_id
,emp_name
,lower(status)
from dw_employee
忽略大小写匹配职位等于‘ANALYST’的记录
select * from dw_employee where upper(status)='ANALYST'

查询出薪水在5000到8000之间的员工(between and)
select * from dw_employee where salary between 5000 and 8000;
查询出2016年入职的员工
select * from dw_employee where year(in_work_date)=2016

薪水不在5000到8000的员工
select * from dw_employee where salary not between 5000 and 8000;

查询出职位是Manager或者analyst的员工
select * from dw_employee where status in(Manager,analyst);

模糊查询like %
查询出没有岗位工资的员工
select * from dw_employee where status_salary is null;

查询有岗位工资的员工
select * from dw_employee where status_salary is not null;

查询出不在10部门和不再30部门的员工
select * from where dw_employee where dep_id not in(10,30)

DDL 数据定义语言
insert select

create table employee_leader like dw_employee
insert into dw_employee_leader select * from dw_employee where leader_id is null

insert overwrite table dw_employee_leader select * from dw_employee where leader_id is null

排序问题
oder by 升序 asc 降序 desc
select * from dw_employee order by salary desc;

hive 的order by 全排序是通过只设置一个reducer 节点的方式来实现的
通过hive可以很轻松的实现二次排序
select * from dw_employee order by salary desc,salary_status desc;

查询多少个员工
select count(*) from dw_employee

分组表达式 Group by 聚合函数 Count max min avg sum
查询有多少个员工
select count(*) from dw_employee
查询有多少个姓张的员工
select count(*) from dw_employee where emp_name like '%张%'
计算员工的总薪水是多少
select sum(salary) from dw_employee

计算员工的人数总和、薪水综合、平均薪水,最高薪水、最低薪水
select
count(*)
,sum(salary)
,avg(salary)
,max(salary)
,min(salary)
from dw_employee

求出每个部门的最高薪水、最低薪水、平均薪水、总薪水、总人数
select
count(*)
,sum(salary)
,avg(salary)
,max(salary)
,min(salary)
from dw_employee
group by dep_id;

----求出总人数超过两人的部门的最高 最低 平均 总薪水

select
count(*)
,sum(salary)
,avg(salary)
,max(salary)
,min(salary)
from dw_employee
group by dep_id;
having count(*)>2

having 的作用 是在聚合后做一次删选 Having 用来对分组后的结果进行进一步的过滤

select * from dw_employee where salary in (select max(salary) from dw_employee)

-----in 在后面添加子查询结果作为判断条件 如果子查询中有索引的话 in 是用不到这个索引 因此 in对接子查询的效率最低

子查询
查询出最高薪水的人的信息
select * from dw_employee where salary in (select max(salary) from dw_employe)
最低薪水的人
select * from dw_employee where salary in (select min(salary) from dw_employe)

工资高于平均薪水的人的信息
目前 hive目前不支持子查询的非等值查询
所以使用 笛卡尔 乘积的方式

因为参数原因 不允许使用笛卡尔 乘积 所以需要通过指令设置一下让它允许
set hive.strict.checks.cartesian.product=false
select a.*
,b.*
from dw_employee a, (select avg(salary)avesalary from dw_employee)b
where a.salary >b.avgsalary
谁的薪水比小赵的薪水高
select a.*
from dw_employee a,(select salary from dw_employee where emp_name='小赵')b

where a.salary>b.salary
研发部有哪些职位
select status
from dw_employee a
where exists(select dep_id
from department b
where dep_name ='研发部'
and a.dep_id =b.dep_id)

ALL 子查询 Any(子查询)

谁是妖姬的同部门的同事
select * from dw_employee where dep_id in(select dep_id from dw_employee where emp_name ='妖姬')

如果有两个叫妖姬 谁是妖姬的同事???

inner join 是两张表根据关联条件 相互过滤 能够关联上的数据才会出现在结果集中

Exists
not exists
union 去重
union all 不去重

薪水大于8000或者小于2000或者等于5000的员工
select * from dw_employee where salary>8000
union
select * from dw_employee where salary <2000
union
select * from dw_employee where salary=5000

交集 intersect
差集 minus

lefter outer join right outer join

时间: 2024-08-17 14:53:08

Hive SQL 练习(这个秒退是怎么回事啊?写了半天 东西都没了,瞬间整个人都凌乱了)的相关文章

Hive SQL

Hive SQL的用法是大数据中比较重要的一个部分 Sql DDL 数据定义语言 create 数据库的创建 alter 修改数据库对象 drop 删除数据库对象 truncate 清空表数据,表级别的操作,删除后数据不可恢复 DML 数据操纵语言 insert 插入操作 update更新操作 delete删除操作 DQL 数据查询语句 SELECT DCL 数据控制语言 用于执行权限的授予和收回操作 GRANT:授予 ,geiyongh给用户授权 Revoke:收回用户已有的权限 Create

使用HIVE SQL实现推荐系统数据补全

需求 在推荐系统场景中,如果基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果很可能达不到要求的数量. 比如,希望针对每个item或user推荐20个item,但是通过计算只得到8个,剩下的12个就需要补全. 策略 数据补全的具体策略是: 补全时机:在挖掘计算结束后,挖掘结果导入HBase(最终web系统从HBase取数据)前,进行数据补全,补全后的数据再导入HBase.(还有另外一个可选时机,在接到请求后再在程序中实现补全,但这样的效率肯定没有直接从HBase中读数的高,所以空间换

有没有检查hive sql的代码检查工具

问题描述 有没有检查hive sql的代码检查工具 有没有工具,可以批量的检查hive sql代码的执行效率,并提供出建议. 解决方案 长远设想,把如下的优化方案做成通用的hive优化方法 采样log表,哪些memberid比较倾斜,得到一个结果表tmp1.由于对计算框架来说,所有的数据过来,他都是不知道数据分布情况的,所以采样是并不可少的.Stage1 数据的分布符合社会学统计规则,贫富不均.倾斜的key不会太多,就像一个社会的富人不多,奇特的人不多一样.所以tmp1记录数会很少.把tmp1和

帮忙写一段sql,重复数据取时间最近的怎么写?

问题描述 帮忙写一段sql,重复数据取时间最近的怎么写? 表如下学号 姓名 成绩 时间1 小明 88 9-5 1 小明 80 9-4 1 小明 70 9-3 输出结果学号 姓名 成绩 时间 1 小明 88 9-5 要求不用top.order by做 解决方案 select * from 表名 where 时间列=(selct max(时间列) from 表名) 解决方案二: 人在不,你是需要找出表中有一样的数据 并且拿出时间最大的 还是只有这三条数据找最大的啊

mysql-Mysql体积差异怎么都那么大?各版本都怎么回事啊?

问题描述 Mysql体积差异怎么都那么大?各版本都怎么回事啊? 有的30来M,有的却200M,有的是msi格式,有的却是绿色版的.它们都什么区别啊? 200M的安装后大概占空间800来M吧,而绿色版的也差不多,但是安装版的还有什么excel.c++的东西,绿色版的却没发现相关的东西--好迷茫啊 解决方案 http://dev.mysql.com/downloads/mysql/ 拿这个页面的几个版本来说吧,最上面的下面写着All MySQL Product--,表示内部含有MySQL的Serve

xml-我方照着案例写了几个XML文件,单独验证都没问题,可是打开computers一验证就出现错误。这是怎么回事?

问题描述 我方照着案例写了几个XML文件,单独验证都没问题,可是打开computers一验证就出现错误.这是怎么回事? 我完全仿照案例写的,可还是有问题. 解决方案 http://blog.csdn.net/ranbolwb/article/details/7473845 解决方案二: .....问题太长了吧

=号附近有语法错误 看来看去都没找到 sql语句没错误呀

问题描述 =号附近有语法错误 看来看去都没找到 sql语句没错误呀 private void button1_Click(object sender, EventArgs e) { string sql = "select count(*) from T_USER where users='" + tb_user.Text.Trim() + "'"; DataSet ds = account.Getdateset(sql); if (ds != null &

sql server 2008-Sql安装到点安装后就什么都没了?

问题描述 Sql安装到点安装后就什么都没了? sql server 2008安装到这一步就什么都没了 解决方案 你是不是原来装过sql 如果有的话要卸载干净 不要有残留文件 如果还是不行的话只能重装系统了 解决方案二: 一般是有什么系统必备组件没有装对,看下错误提示

菜鸟:C#+sql 做餐饮系统,网上找了很多都没的,简单的也可以 帮忙!

问题描述 菜鸟等级需求:C#+sql餐饮管理系统,数据库(表)及外观是关键,其他的自己可以慢慢解决(全套+说明最好拉!)网上找了很多都没的,而且都不是C#的.....我快要找的疯掉了自己动手思路也不是很清溪简单的也可以帮忙!HELP!PS:第一次发贴,也不知道在这里的分是什么东西,所有分么.... 解决方案 解决方案二:买本.net的例子书,很多源代码的.而且还手把手的教你开发.解决方案三:其实很简单的,主要就是对数据库的一个增删改查,不太复杂的,我也是一个从菜鸟学习的程序员,你可以加QQ:56