zoukankan      html  css  js  c++  java
  • Hive SQL 语法学习与实践

    Hive 介绍

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据。而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析。

    它与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。

    HIVE的特点:可伸缩(在Hadoop的集群上动态的添加设备),可扩展,容错,输入格式的松散耦合。

    Hive SQL语法

    查询SQL

    基本的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表示去掉重复的记录。

    从SQL到HiveQL应转变的习惯

    1. Hive不支持等值连接

      SQL中对两表内联可以写成:

      select * from dual a,dual b where a.key = b.key;

      Hive中应为

      select * from dual a join dual b on a.key = b.key;
    2. 分号字符

      分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

      select concat(key,concat(';',key)) from dual;

      但HiveQL在解析语句时提示:

      FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification

      解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

      select concat(key,concat('73',key)) from dual;
    3. IS [NOT] NULL

      SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False

    4. Hive不支持将数据插入现有的表或分区中,仅支持覆盖重写整个表,示例如下:

      INSERT OVERWRITE TABLE t1

    Hive SQL查询实践

     

    1.查询具体某日的快捷支付量

    快捷支付对应的字段paytype应大于31,并且支付结果result应为1,查询如下:

    SELECT COUNT(*)
    FROM log.pay_rc_warden_event_basic
    WHERE dt = "20180715" AND method = "sendevent" AND paytype > 31 AND result = 1

     

     

     

    2.查询某日支付的总成功率

    SELECT SUM(CASE when rcw.eventid=2 and rcw.method = 'sendevent' then 1 else 0 END) as successCnt,
           SUM(CASE when rcw.eventid=4 and rcw.method = 'risklevel' then 1 else 0 END) as payCnt,
           SUM(CASE when rcw.eventid=2 and rcw.method = 'sendevent' then 1 else 0 END)/SUM(CASE when rcw.eventid=4 and rcw.method = 'risklevel' then 1 else 0 END) as rate
      FROM (
            SELECT DISTINCT payorderid,
                   eventid,
                   method
              FROM log.pay_rc_warden_event_basic
             WHERE dt = "20180715"
           )rcw

    3.查询各业务线的成功率

    SELECT rcw.partner as partner,
           SUM(CASE when rcw.eventid=2 and rcw.method = 'sendevent' then 1 else 0 END) as successCnt,
           SUM(CASE when rcw.eventid=4 and rcw.method = 'risklevel' then 1 else 0 END) as payCnt,
           SUM(CASE when rcw.eventid=2 and rcw.method = 'sendevent' then 1 else 0 END)/SUM(CASE when rcw.eventid=4 and rcw.method = 'risklevel' then 1 else 0 END) as rate
      FROM (
            SELECT DISTINCT payorderid,
                   eventid,
                   partner,
                   method
              FROM log.pay_rc_warden_event_basic
             WHERE dt = "20180715"
           )rcw
     GROUP BY rcw.partner
     ORDER BY successCnt desc
     LIMIT 100
  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/wmx24/p/9343537.html
Copyright © 2011-2022 走看看