• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

hive sql执行顺序以及相关例子

Sql admin 2年前 (2017-12-27) 1485次浏览 0个评论 扫描二维码
日常使用的数据查询工具都是 hive,了解一下 hive sql 执行顺序,其实与 mysql 之间的差异不是太大,参考 mysql 的执行顺序,hive 的执行顺序如下
  1. from
  2. on
  3. join
  4. where
  5. group by
  6. having
  7. select
  8. distinct
  9. union
  10. order by
举例
explainselectcity,ad_type,device,sum(cnt)ascntfromtb_pmp_raw_log_basic_analysiswhereday=’2016-05-28’andtype =0andmedia =’sohu’and(deal_id =”ordeal_id =’-‘ordeal_idisNULL)groupbycity,ad_type,device
对应的 stage 任务如下
STAGE DEPENDENCIES:
  Stage-1is a root stage
  Stage-0is a root stage
STAGE PLANS:
  Stage: Stage-1
   MapReduce
     MapOperator Tree:
          TableScan
            alias: tb_pmp_raw_log_basic_analysis
            Statistics: Numrows:8195357Datasize:580058024Basic stats: COMPLETE Column stats:NONE
            Filter Operator
              predicate: (((deal_id=”)or(deal_id=’-‘))ordeal_id isnull) (type: boolean)
              Statistics: Numrows:8195357Datasize:580058024Basic stats: COMPLETE Column stats:NONE
             SelectOperator
                expressions: city (type:string), ad_type (type:string), device (type:string), cnt (type: bigint)
                outputColumnNames: city, ad_type, device, cnt
                Statistics: Numrows:8195357Datasize:580058024Basic stats: COMPLETE Column stats:NONE
               GroupByOperator
                  aggregations:sum(cnt)
                  keys: city (type:string), ad_type (type:string), device (type:string)
                  mode: hash
                  outputColumnNames: _col0, _col1, _col2, _col3
                  Statistics: Numrows:8195357Datasize:580058024Basic stats: COMPLETE Column stats:NONE
                  Reduce Output Operator
                    key expressions: _col0 (type:string), _col1 (type:string), _col2 (type:string)
                    sortorder:+++
                   Map-reducepartition columns: _col0 (type:string), _col1 (type:string), _col2 (type:string)
                    Statistics: Numrows:8195357Datasize:580058024Basic stats: COMPLETE Column stats:NONE
                    value expressions: _col3 (type: bigint)
      Reduce Operator Tree:
       GroupByOperator
          aggregations:sum(VALUE._col0)
          keys: KEY._col0 (type:string), KEY._col1 (type:string), KEY._col2 (type:string)
          mode: mergepartial
          outputColumnNames: _col0, _col1, _col2, _col3
          Statistics: Numrows:4097678Datasize:290028976Basic stats: COMPLETE Column stats:NONE
         SelectOperator
            expressions: _col0 (type:string), _col1 (type:string), _col2 (type:string), _col3 (type: bigint)
            outputColumnNames: _col0, _col1, _col2, _col3
            Statistics: Numrows:4097678Datasize:290028976Basic stats: COMPLETE Column stats:NONE
            File Output Operator
              compressed:false
              Statistics: Numrows:4097678Datasize:290028976Basic stats: COMPLETE Column stats:NONE
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
                  serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
  Stage: Stage-0
    Fetch Operator
      limit:-1
具体介绍如下
**stage1 的 map 阶段**
        TableScan:from 加载表,描述中有行数和大小等
        Filter Operator:where 过滤条件筛选数据,描述有具体筛选条件和行数、大小等
        Select Operator:筛选列,描述中有列名、类型,输出类型、大小等。
        Group By Operator:分组,描述了分组后需要计算的函数,keys 描述用于分组的列,outputColumnNames 为输出的列名,可以看出列默认使用固定的别名 _col0,以及其他信息
        Reduce Output Operator:map 端本地的 reduce,进行本地的计算,然后按列映射到对应的 reduce
**stage1 的 reduce 阶段 Reduce Operator Tree**
        Group By Operator:总体分组,并按函数计算。map 计算后的结果在 reduce 端的合并。描述类似。mode: mergepartial 是说合并 map 的计算结果。map 端是 hash 映射分组
        Select Operator:最后过滤列用于输出结果
        File Output Operator:输出结果到临时文件中,描述介绍了压缩格式、输出文件格式。
        stage0 第二阶段没有,这里可以实现 limit 100 的操作
一些填坑点相关的记录
(1)join  on  where 的使用
  • 对于 inner join 不会有影响
  • 对于外连接有影响
    a. WHERE 操作是对在 join 之后操作
    b. ON 操作是在 join 之前
举例说明: 下面给出相应的表数据
   1.documents:
    |id   |name       |
    ——–|————-|
    |1    |Document1  |
    |2    |Document2  |
    |3    |Document3  |
    |4    |Document4  |
    |5    |Document5  |
   2.downloads:
    |id  |document_id  |username|
    |——|—————|———-|
    |1   |1            |sandeep |
    |2   |1            |simi    |
    |3   |2            |sandeep |
    |4   |2            |reya    |
    |5   |3            |simi    |
a) 使用 where 操作
由于是在 jion 之后才进行筛选操作,使用 left join 操作实际上会产生 7 条数据,由于 ID 在 downloads 表中没有 4,5,所以对应的数据都是 NULL
此时 where 的条件筛选的作用出来了,只有 username=‘sandeep’的数据才会被保留,因此符合这个条件的只有两条数据
 SELECTdocuments.name,downloads.id
   FROMdocuments
   LEFTOUTERJOINdownloads
     ONdocuments.id=downloads.document_id
   WHEREusername=’sandeep’
Forabove query the intermediatejointablewill looklikethis.
   |id(fromdocuments)|name        |id(fromdownloads)|document_id|username|
   |——————–|————–|———————|————-|———-|
   |1                 |Document1   |1                  |1          |sandeep |
   |1                 |Document1   |2                  |1          |simi    |
   |2                 |Document2   |3                  |2          |sandeep |
   |2                 |Document2   |4                  |2          |reya    |
   |3                 |Document3   |5                  |3          |simi    |
   |4                 |Document4   |NULL               |NULL       |NULL    |
   |5                 |Document5   |NULL               |NULL       |NULL    |
  After applying the`WHERE`clauseandselecting the listed attributes,the result will be:
  |name        |id|
  |————–|—-|
  |Document1   |1 |
  |Document2   |3 |
b) 使用 on,是在 join 之前就参与条件筛选
 SELECTdocuments.name,downloads.id
 FROMdocuments
   LEFTOUTERJOINdownloads
     ONdocuments.id=downloads.document_id
       ANDusername=’sandeep’
在没有 select 之前进行获取的左连接的数据如下所示:
 
   |id(fromdocuments)|name        |id(fromdownloads)|document_id|username|
   |——————–|————–|———————|————-|———-|
   |1                 |Document1   |1                  |1          |sandeep |
   |2                 |Document2   |3                  |2          |sandeep |
   |3                 |Document3   |NULL               |NULL       |NULL    |
   |4                 |Document4   |NULL               |NULL       |NULL    |
   |5                 |Document5   |NULL               |NULL       |NULL    |
上面数据表中没有满足两个条件的输出的数据都是 null,只有满足两个条件的数据才会输出实际的数据结果,比如前两个数据
最终输出的结果数据如下所示:
 
  |name      |id  |
  |————|——|
  |  Document1|1   |
  |  Document2|3   |
  |  Document3|NULL|
  |  Document4|NULL|
  |  Document5|NULL|

Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hive sql 执行顺序以及相关例子
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!