zoukankan      html  css  js  c++  java
  • Hive之数据查询

    Hive之数据查询

    一,排序和聚合
    对于排序有两种方式,一种是order by 一种是sort by
    order by 会对所有的数据进行排序,所以最后会只有一个reducer来处理,如果数据量非常大,效率会非常差劲
    sort by是部分排序,只是对一个reducer的数据进行排序

    FROM records2
    SELECT year, temperature
    DISTRIBUTE BY year
    SORT BY year ASC, temperature DESC;
    1949 111
    1949 78
    1950 22
    1950 0
    1950 -11


    关键字DISTRIBUTE主要是控制特定的行会分发到同一个reducer里面去处理,这样后面再进行聚合操作就很方便。

    二,连接查询

    hive> SELECT * FROM sales; -- name 购买者的名字,id购买的商品id
    Joe 2
    Hank 4 
    Ali 0
    Eve 3
    Hank 2
    hive> SELECT * FROM things; --name 商品名称 id 商品id
    2 Tie
    4 Coat
    3 Hat
    1 Scarf


    1,内连接

    hive> SELECT sales.*, things.*
    > FROM sales JOIN things ON (sales.id = things.id);


    Screenshot from 2013-10-11 19:01:53

    SELECT sales.*, things.*
    FROM sales, things
    WHERE sales.id = things.id;


    需要注意的是对于MySQL和Oracel里面常用的等值连接方式,hive是不支持的。

    2,外连接

    hive> SELECT sales.*, things.*
    > FROM sales LEFT OUTER JOIN things ON (sales.id = things.id);
     
    Ali    0   NULL  NULL
    Joe    2   2    Tie
    Hank   2   2    Tie
    Eve    3   3    Hat
    Hank   4   4    Coat
     
    hive> SELECT sales.*, things.*
    > FROM sales RIGHT OUTER JOIN things ON (sales.id = things.id);
     
    NULL  NULL 1    Scarf
    Joe    2   2    Tie
    Hank   2   2    Tie
    Eve    3   3    Hat
    Hank   4   4    Coat
     
    hive> SELECT sales.*, things.*
    > FROM sales FULL OUTER JOIN things ON (sales.id = things.id);
     
    Ali    0   NULL  NULL
    NULL  NULL 1    Scarf
    Joe    2   2    Tie
    Hank   2   2    Tie
    Eve    3   3    Hat
    Hank   4   4    Coat


    3,Semi joins

    先来看一个查询:

    SELECT *
    FROM things
    WHERE things.id IN (SELECT id from sales);
     
    注意:hive不支持这种在in中使用子查询的语法,但是下面的查询是同样的意思
    hive> SELECT *
    > FROM things LEFT SEMI JOIN sales ON (sales.id = things.id);


    但是使用SEMI JOIN有一定的限制,就是右边的表不允许出现在select中只能出现在on从句中

    4,子查询
    对于子查询hive有一些限制,只能在from里面使用子查询
    例如:
    select total from
    (select c1+c2 as total from table) my_sub_query;
    子查询必须指定一个名字


  • 相关阅读:
    [2012山东ACM省赛] Fruit Ninja II (三重积分,椭球体积)
    [2012山东ACM省赛] The Best Seat in ACM Contest (模拟)
    [2012山东ACM省赛] n a^o7 !(模拟,字符替换)
    [ACM] Hrbustoj 1376 能量项链 (区间动态规划)
    红黑树 c++ 实现
    八大排序算法
    git 常用命令
    linux 学习笔记 day1
    挑战:数据提取 — 实验楼
    挑战:历史命令 — 实验楼
  • 原文地址:https://www.cnblogs.com/jamesf/p/4751494.html
Copyright © 2011-2022 走看看