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
  • 相关阅读:
    linux配置虚拟机的网络服务
    js动态生成层方法 不懂得加QQ 2270312758
    js中let和var的区别 不懂得加QQ 2270312758
    C#特性详解
    (四)python之文件处理
    (三)python之字符编码
    (二)Python之数据类型
    (一)python基础
    (2)库相关操作
    (1)初始数据库
  • 原文地址:https://www.cnblogs.com/wmx24/p/9343537.html
Copyright © 2011-2022 走看看