zoukankan      html  css  js  c++  java
  • hive小练习_联合查询

      1 创建2张表 用户表User和会员表 vip
      2 user表中字段如下
      3  uid    身份证号  uid int comment 'UserCard'
      4  name   姓名
      5  phone  电话
      6  sex    性别
      7  salary 工薪
      8  address 地址
      9 
     10 create table user(
     11 uid bigint comment 'UserCard',
     12 name string comment 'UserName',
     13 phone bigint comment 'PhoneNum',
     14 sex string comment 'UserSex',
     15 salary float comment 'UserSalary',
     16 address string comment 'UserAddress'
     17 )row format delimited fields terminated by ' ';
     18 
     19 数据
     20 41303116465465564 张三 1583854444930000.0 北京
     21 41303116213215564 李四 1583832131492000.0 北京
     22 41303152323365564 王五 1583854444950000.0 北京
     23 41305555544465564 赵六 158385444494000.0 北京
     24 41306666666666564 田七 158385444498000.0 北京
     25 41305555544465587 韩梅梅 158385554496000.0 郑州
     26 41306666666666589 田七 15838544667000.0 洛阳
     27 
     28 
     29 
     30 vip表中字段如下
     31  vid     vip编号
     32  vname   vip名
     33  uid     身份证号
     34 
     35 create table vip(
     36 vid int,
     37 vname string,
     38 uid string
     39 )row format delimited fields terminated by ' ';
     40 
     41 
     42 1001 老张 41305555544465564 
     43 1002 Mvp刘 41306666666666564
     44 1003 MZ 41303152323365564
     45 1004 皮皮狗 41303116465465564
     46 1005 朝花夕拾 654651313215646
     47 1006 血色残阳 165465554465131x
     48 
     49 
     50 1.向两张表中插入5行数据
     51 hadoop fs -put user.txt /user/hive/warehouse/db_1904.db/user
     52 hadoop fs -put vip.txt /user/hive/warehouse/db_1904.db/vip
     53 
     54 2.查询办理会员的用户所有信息
     55 select * from user u inner join vip v on u.uid=v.uid;
     56 
     57 3.查询办理会员的用户姓名 电话 地址和vip名称
     58 select u.name,u.phone,u.address,v.vname from user u inner join vip v on u.uid=v.uid;
     59 
     60 4.查询出左表中所有数据再与右表相匹配(左外连接)
     61 select * from user u left outer join vip v on u.uid=v.uid;
     62 
     63 5.右外连接(右表数据完全显示,让左表与其连接没有匹配项使用null)
     64 select * from user u right outer join vip v on u.uid=v.uid;
     65 
     66 6.全外连接
     67 select * from user u full join vip v on u.uid=v.uid;
     68 
     69 7.左半连接(只获取与右边等值连接条件匹配的数据,不显示右表 如果重复会去除重复相当于map中的key)
     70 select * from user u left semi join vip v on u.uid=v.uid;
     71 
     72 8.order by 排序 (全局排序,整个过程由一个reduce来完成)
     73 select * from user order by sex,salary;
     74 
     75 9.sort by排序  (局部排序,整个过程中可以是多个reduce来完成 输出结果可能会有重合)
     76 select * from user sort by sex,salary;
     77 
     78 班中分为男女生  按照性别排  再按照各自的成绩排序
     79 
     80 10.distribute by 和 sort by 语句 (distribute by +分区列  sort by +排序列A,排序列B 先后有影响)
     81    可以实现2次排序,类似与MR中partition
     82 select name,sex,salary from user distribute by sex sort by sex,salary desc;
     83 
     84 11.cluster by 可以代替distribute by 和 sort by 语句 
     85 select name,sex,salary from user cluster by sex,salary;
     86 
     87 需求:
     88  1.获取User表中的总人数
     89  select count(uid) from user;
     90 
     91  2.获取User表中工资最高的人信息
     92  select * from user order by salary desc limit 1;
     93 
     94  3.获取User表中工资最低的人信息
     95  select * from user order by salary asc limit 1;
     96 
     97  4.获取平均工资
     98  select round(avg(salary),2) from user;
     99  
    100  5.获取当月需要发放的总工资
    101  select sum(salary) from user;
    102 
    103 将10的结果导出到mysql表中(hive导出数据到mysql)
    104 
    105 1.将10的结果复制到新表
    106 create table user_sex_salary row format delimited fields terminated by '	' as 
    107 select name,sex,salary from user distribute by sex sort by sex,salary desc;
    108 
    109 2.mysql创建表接受数据
    110 create table user(
    111 name varchar(50),
    112 sex varchar(50),
    113 salary float
    114 );
    115 
    116 3.使用sqoop导出
    117 sqoop export 
    118 --connect jdbc:mysql://localhost:3306/lpy"?useUnicode=true&characterEncoding=utf-8" 
    119 --username root 
    120 --password 123456 
    121 --table user 
    122 --export-dir '/user/hive/warehouse/db_1904.db/user_sex_salary/000000_0' 
    123 --input-fields-terminated-by '	' 
    124 -m 1;

    总结:

    1.联合查询
      内连接
      语法: select * from 表A inner join 表B on 等值连接条件;
      查询结果为条件相等的左表和右表中的数据


      左外连接
      语法: select * from 表A left join 表B on 等值连接条件;
      查询左表的所有数据跟右表匹配,匹配不到的数据用NUll占用


      右外连接
      语法: select * from 表A right join 表B on 等值连接条件;
      查询右表的所有数据跟左表匹配,匹配不到的数据用NUll占用


      全外连接

    语法: select * from 表A full join 表B on 等值连接条件;
    结果集会包含左表和右表的所有记录


    左半连接
    语法: select * from 表A left semi join 表B on 等值连接条件;
    只获取与右边等值连接条件匹配的数据,不显示右表 如果重复会去除重复相当于map中的key

     

  • 相关阅读:
    2014-3-10 时间都去哪了,还没好好感受年轻就老了
    2014-3-4 思杨昨天已经顺利到老家 --------- 回忆思杨之2--“叫你不穿鞋鞋”
    2014-3-4 鬼脸笑笑的思杨
    路由
    视图
    请求与响应
    序列化组件
    APIView源码分析
    CBV源码分析
    DRF入门规范
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/15225607.html
Copyright © 2011-2022 走看看