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;
    子查询必须指定一个名字


  • 相关阅读:
    安卓任意两个或多个Fragment之间的交互与刷新界面
    内存溢出和内存泄漏
    求直方图围成的最大矩形面积
    判断一个字符串是否是由另2个字符串交错组成的
    矩阵的旋转
    求滑动窗口的最大值
    面向过程和面向对象的区别
    关于丑数
    求连续子数组的最大和
    多数投票算法(Majority Vote Algorithm)
  • 原文地址:https://www.cnblogs.com/jamesf/p/4751494.html
Copyright © 2011-2022 走看看