一、基本的Select 操作

语法
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[   CLUSTER BY col_list
  | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
[LIMIT number]
•使用ALL和DISTINCT选项区分对重复记录的处理。
  默认是ALL,表示查询所有记录。DISTINCT表示去掉重复的记录
•Where 条件
  类似我们传统SQL的where 条件
  目前支持 AND,OR ,0.9版本支持between
  IN, NOT IN
  不支持EXIST ,NOT EXIST
ORDER BY与SORT BY的不同
  ORDER BY 全局排序,只有一个Reduce任务
  SORT BY 只在本机做排序
Limit
  Limit 可以限制查询的记录数
  SELECT * FROM t1 LIMIT 5
  实现Top k 查询
  下面的查询语句查询销售记录最大的 5 个销售代表。
  SET mapred.reduce.tasks = 1 
    SELECT * FROM test SORT BY amount DESC LIMIT 5
REGEX Column Specification
  SELECT 语句可以使用正则表达式做列选择,下面的语句查询除了 ds 和 hr 之外的所有列:
  SELECT `(ds|hr)?+.+` FROM test

示例
例如
  按先件查询
    SELECT a.foo FROM invites a WHERE a.ds='<DATE>';
  将查询数据输出至目录:
    INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';
  将查询结果输出至本地目录:
    INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

选择所有列到本地目录 :
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

将一个表的统计结果插入另一个表中:
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

将多表数据插入到同一表中:
FROM src
INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

将文件流直接插入文件:
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)

2. 基于Partition的查询
  一般 SELECT 查询会扫描整个表,使用 PARTITIONED BY 子句建表,查询就可以利用分区剪枝(input pruning)的特性
  Hive 当前的实现是,只有分区断言出现在离 FROM 子句最近的那个WHERE 子句中,才会启用分区剪枝
  可以使用 explain dependency语法,获取input table和input partition
3.Join
语法
join_table: 
   table_reference JOIN table_factor [join_condition] 
  | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition 
  | table_reference LEFT SEMI JOIN table_reference join_condition

table_reference: 
    table_factor 
  | join_table

table_factor: 
    tbl_name [alias] 
  | table_subquery alias 
  | ( table_references )

join_condition: 
    ON equality_expression ( AND equality_expression )*

equality_expression: 
    expression = expression
•Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值连接非常难转化到 map/reduce 任务
•LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的情况
•LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现
•join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统
•实践中,应该把最大的那个表写在最后

join 查询时,需要注意几个关键点
1、只支持等值join
  •SELECT a.* FROM a JOIN b ON (a.id = b.id)
  •SELECT a.* FROM a JOIN b 
      ON (a.id = b.id AND a.department = b.department)
  •可以 join 多于 2 个表,例如
     SELECT a.val, b.val, c.val FROM a JOIN b 
        ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
2、如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务
3、增加on条件,避免笛卡尔积
4、在Join前使用where过滤不需要的数据
  

5、小表放在前,大表放在后
  原因、在Reduce阶段,位于Join操作符左边的表的内容会被加载进内存,数据越少,越不会发生OOM

3.1、LEFT,RIGHT和FULL OUTER

示例

基础表结构

  hive> select * from zz0;
    111111
    222222
    888888
  hive> select * from zz1;
    111111
    333333
    444444
    888888

join

  hive> select * from zz0 join zz1 on zz0.uid = zz1.uid;
    111111  111111
    888888  888888

left outer join

  hive> select * from zz0 left outer join zz1 on zz0.uid = zz1.uid;
    111111  111111
    222222  NULL
    888888  888888

right outer join

  hive> select * from zz0 right outer join zz1 on zz0.uid = zz1.uid;
    111111  111111
    NULL    333333
    NULL    444444
    888888  888888

full outer join

  hive> select * from zz0 full outer join zz1 on zz0.uid = zz1.uid;

    111111  111111
    222222  NULL
    NULL    333333
    NULL    444444
    888888  888888

left semi join

  select * from zz0 left semi join zz1 on zz0.uid = zz1.uid;
    111111  111111
    888888  888888

  说明:1、 JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行

    2、于join区别

    

示例

SELECT a.key, a.value 
  FROM a 
  WHERE a.key in 
   (SELECT b.key 
    FROM B);
       可以被重写为:
      SELECT a.key, a.val 
   FROM a LEFT SEMI JOIN b on (a.key = b.key)
4、UNION ALL
  用来合并多个select的查询结果,需要保证select中字段须一致
  select_statement UNION ALL select_statement UNION ALL select_statement ...

4.1、优化

  利用hive对union all 的优化的特性, hive对union all优化只局限于非嵌套查询

  

  合理使用 union all

    不同表太多union all,不推荐使用;

    通常采用建临时分区表,将不同表的的结果insert到不同的分区(可并行),最后在统一处理;

    

4.2、合理使用UDTF

说明

  select col1,col2,newCol from myTable LATERAL VIEW explode(myCol) adTable as newCol

  说明:执行过程相当于单独执行了两次读取,然后union 到一个表里,但job数只有一个、

    同样myCol也需要为数组类型,但日常中我们多数情况下是string类型经过split函数拆分后获取数组类型

示例1:

  

  select id,user,name,city from myTable LATERAL VIEW explode(split(all_citys,',')) adTable as city

  

示例2:

  应用UDTF优化:按不同维度进行订单汇总:

      

第一种写法:【3次读取order_table,4个job】

select * from (
select '',province,sum(sales) from order_table group by province
union all
select '',city,sum(sales) from order_table group by city
union ALL
select '',county,sum(sales) from order_table group by county
)df

第二种

select type,code,sum(sales) from(
select split(part,'_')[] as type,
split(part,'_')[] as code,
sales from order_table LATERAK VIEW
explode(split(concat(province,'_1-',city,'_2-',county,'_3'),'-'))
adTable as part
)df group by type,code

  

009-Hadoop Hive sql语法详解4-DQL 操作:数据查询SQL-select、join、union、udtf的更多相关文章

  1. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  2. [转]Hadoop Hive sql语法详解

    转自 : http://blog.csdn.net/hguisu/article/details/7256833 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式 ...

  3. Hadoop Hive sql 语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询 ...

  4. 【hive】——Hive sql语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  5. hive sql 语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  6. Hive sql语法详解

      Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQ ...

  7. Hive笔记--sql语法详解及JavaAPI

    Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...

  8. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  9. 010-Hadoop Hive sql语法详解5-HiveQL与SQL区别

    1.Hive不支持等值连接 •SQL中对两表内联可以写成:•select * from dual a,dual b where a.key = b.key;•Hive中应为•select * from ...

  10. SQL语法详解

    ALTER DATABASE修改数据库全局特性 ALTER DATABASE实际上是修改数据库目录中的dp.opt文件 ALTER TABLE修改表的结构 ALTER TABLE对表进行增删列,创建取 ...

随机推荐

  1. 微信小程序 - 开发工具之编译模式

    在开发中,遇到一个层级较深的页面,每次都要点击好多步才能调试,也比较闹心,有了自定义编译模式,就方便很多了 点击红圈处, 选择 "+添加编译模式" , 默认的, 启动页面会填入当前 ...

  2. 9款很酷炫jQuery/HTML5特效应用 有源码哦~

            目前最流行的网页特效应用当属jQuery和HTML5的特效应用了,它们可以帮你快速实现网页中的各种特效设计.本文就为了收集了9款非常酷炫的jQuery/HTML5特效应用,可以很方便的 ...

  3. 查看win10的激活信息和版本号

    在命令提示符里输入 cscript /nologo %Windir%\System32\slmgr.vbs /dli&&cscript /nologo %Windir%\System3 ...

  4. Merging an upstream repository into your fork

    1. Check out the branch you wish to merge to. Usually, you will merge into master. $ git checkout ma ...

  5. (转)java泛型

    转自:http://blog.csdn.net/lonelyroamer/article/details/7868820  java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 参考:j ...

  6. MathType中输入不了汉字如何处理

    MathType作为一款常见的数学公式编辑器在编辑数学公式时,不仅可以输入英文字符,对中文也有很好的兼容性.但是有些用户在使用MathType编辑公式时,发现一些汉字是输入不进去的,这个时候我们就需要 ...

  7. CPictureEx类

    CPictueEx类不仅可以显示GIF(包括GIF动画),还可以显示JPEG.BMP.WMF.ICO.CUR等. 参考:https://www.codeproject.com/Articles/142 ...

  8. 基于JEECG的代码模板自动生成

    1.基于JEECG3.5.2,提供多种数据源的代码生成,目前支持Oracle良好: 2.可动态配置数据源: 可动态配置模板集合,基于freemarker的模板文件: 可选择需要生成的数据表: 可导入一 ...

  9. 编程之美 set 12 快速找出故障机器

    题目 1. 所有的 ID 都出现 2 次, 只有一个例外, 找到那个例外的 ID 2. 所有的 ID 都出现两次, 只有两个例外, 找出例外的那两个 总计 1. 剑指 offer 上有这两道题的解法, ...

  10. 复习及总结--.Net线程篇(4)

    这里要说的就是多线程的锁的问题了 锁:作用在于实现线程间的同步问题,最典型的是售票问题 1,InterLocked 提供的都是静态方法,用来同步对多个共享变量的访问,包括以原子方式递增,递减,比较和替 ...