`
flyingdutchman
  • 浏览: 358463 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入学习《Programing Hive》:HiveQL查询(2)

    博客分类:
  • Hive
阅读更多
        浮点比较陷阱
        在WHERE查询条件中:在比较不同类型的数值(如FLOAT vs DOUBLE)时,会引发浮点比较陷阱
        看下面的HiveQL语句,本来只想要查询Federal Taxes > 0.2,但是返回结果如下:
              hive> SELECT name,salary,deductions['Federal Taxes']
                  > FROM employees WHERE deductions['Federal Taxes'] > 0.2;
              John Doe      100000.0  0.2
              Mary Smith     80000.0  0.2
              Boss Man      200000.0  0.3
              Fred Finance  150000.0  0.3
        

        我们发现,为什不符合过滤条件(deductions('Federal Taxes') == 0.2)的结果也返回了?!这就是浮点比较陷阱引发的。
        那么如何来避免这个陷阱呢?那就要将0.2强制转型了:
              hive> SELECT name,salary,deductions['Federal Taxes'] 
                  > FROM employees
                  > WHERE deductions['Federal Taxes'] > cast(0.2 AS FLOAT);
              Boss Man      200000.0  0.3
              Fred Finance  150000.0  0.3
        

       
        LIKE和RLIKE
        LIKE标识模糊查询:
              hive> SELECT name,address.street FROM employees WHERE address.street LIKE '%Ave.';
              John Doe    1 Michigan Ave.
              Todd Hones  200 Chicago Ave.
              
               hive> SELECT name,address.street FROM employees WHERE address.street LIKE '%Chi%';
              Todd Hones  200 Chicago Ave.
        

        RLIKE是使用正则表达式:
              hive> SELECT name,address.street FROM employees
                  > WHERE address.street RLIKE '.*(Chicago|Ontario).*';
              Mary Smith   100 Ontario St.
              Todd Jones   200 Chicago Ave.
        


        GROUP BY
        Hive的GROUP BY语句和传统的SQL相同,经常要和聚合函数一块儿使用,我们再看一下stocks表的定义:
              CREAT EXTENAL TABLE IF NOT EXISTS stocks(
                exchange     STRING,
                symbol       STRING,
                ymd          STRING,
                price_open   FLOAT,
                price_high   FLOAT,
                price_low    FLOAT,
                price_close  FLOAT,
                volume       INT,
                price_adj_close  FLOAT)
                ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
                LOCATION '/data/stocks';
        

        示例如下:
              hive> SELECT year(ymd),avg(price_close) FROM stocks
                  > WHERE exchange = 'NASDAQ' AND symbol = 'AAPL'
                  > GROUP BY year(ymd);
              1984  25.578625440597534
              1985  20.193676221040867
              1986  32.46102808021274
              ...
        


        HAVING
        Hive中的HAVING关键字和传统SQL中的概念相同,是对分组后的结果再次过滤。使用HAVING可以避免GROUP BY后的子查询:
              hive> SELECT year(ymd),avg(price_close) FROM stocks
                  > WHERE exchange = 'NASDAQ' AND symbol = 'AAPL'
                  > GROUP BY year(ymd)
                  > HAVING avg(price_close) > 50.0;
              1987  53.88968399108163
              1991  52.49553383386182
              1992  54.80338610251119
              2000  71.74892876261757
              ...
        

        如果不使用HAVING,那么就要使用子查询:
              hive> SELECT s2.year,s2.avg FROM 
                  > (SELECT year(ymd) AS year,avg(price_close) AS avg FROM stocks
                  >   WHERE exchange = 'NASDAQ' AND symbol = 'AAPL'
                  >   GROUP BY year(ymd)
                  >  ) s2
                  > WHERE s2.avg > 50.0
        


        JION
        Hive支持典型的SQL JION连接,但只支持等值连接
        Hive中的内连接、左外连接、右外连接和全外连接和标准的SQL中的连接有相同的概念;但是在Hive中没有IN、EXISTS关键字的使用,取代这两个关键字的功能的是LEFT SEMI-JION,也是对Inner JION的性能上的加强优化。
        LEFT SEMI-JION
        LEFT SEMI-JION和MySQL方言中的IN... EXISTS...结构做同样的事情:
              hive> SELECT s.ymd,s.symbol,s.price_close 
                  > FROM stocks s LEFT SEMI JION dividends d ON s.ymd = d.ymd AND s.symbol = s.symbol;
              ...
              1962-11-05   IBM   361.5
              1962-08-07   IBM   373.25
              1962-05-08   IBM   459.5
              ...
        

        LEFT SEMI JOIN 的限制是,JOIN子句中右边的表只能在ON子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

        JION优化
        1)、将小表放在JION的左边,Hive会将JION左边的小表中的数据缓存起来,然后流式(stream)处理最后的表中的数据,这可以提高HiveQL查询的性能:
              SELECT s.ymd,s.symbol,s.price_close,d.dividend
              FROM dividend d JION stocks s ON s.ymd = d.ymd AND s.symbol = d.symbol
              WHERE s.symbol = 'AAPL';
        

        幸运的是,用户不用必须把要流式(stream)处理的表放在JION的右边,Hive提供了一个“hint”机制来告诉查询优化器那个表中的数据需要被流式(stream)处理:
              SELECT /*+ STREAMTABLE(s) */ s.ymd,s.symbol,s.price_close,d.dividend
              FROM stocks s JION dividend d ON s.ymd = d.ymd AND s.symbol = d.symbol
              WHERE s.symbol = 'AAPL';
        

        2)、在多个表做JION连接时,如果ON字句中的jion keys都相同时,Hive会把多个table的jion连接编译为一个MapReduce Job,否则一次jion连接会编译成一个job。
        3)、Map-Side Jion:Hive提供Map端的jion连接操作,默认情况下是不支持该操作的,用户必须强制告知查询优化器做Map端的Jion连接操作,这可以避免对结果进行大规模的笛卡尔集的操作,也可以减少数据的I/O流量:
              SELECT /*+ MAPJION(s) */ s.ymd,s.symbol,s.price_close,d.dividend
              FROM stocks s JION dividend d ON s.ymd = d.ymd AND s.symbol = d.symbol
              WHERE s.symbol = 'AAPL';
        

        当然做Map端的Jion连接操作之前,必须要设置一些参数:
              hive> SET hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;;
              hive> SET hive.optimize.bucketmapjion=true;
              hive> SET hive.optimize.bucketmapjion.sortedmerge=true;
        

    
        ORDER BY和SORT BY
        ORDER BY和SQL方言中的order by 语句很像,会对所有的结果集做整体的排序操作,这就意味着所有的数据是通过一个Reducer处理的;对处理非常大的数据及来说,这会执行非常长的处理时间。
        Hive提供了一种局部排序的功能——SORT BY,只对每个Reducer处理的局部数据排序,也是一个本地排序,这也就是说每个Reducer处理后的数据是排序的,但对整体而言是无序的。
              SELECT s.ymd,s.symbol,s.price_close FROM stocks s
              ORDER BY s.ymd ASC,s.symbol DESC;

              SELECT s.ymd,s.symbol,s.price_close FROM stocks s
              SORT BY s.ymd ASC,s.symbol DESC;
        
分享到:
评论

相关推荐

    HIVE编程指南

    HIVE编程指南中文版,是由programing hive翻译过来

    Programing1:编程的最终评估1

    下面我们将深入探讨这个评估可能涉及的一些关键知识点。 首先,基础编程语言的语法是必不可少的。无论是Python、Java、C++还是其他语言,掌握变量定义、数据类型(如整型、浮点型、字符串、布尔型等)、控制流程...

    Hive编程中文版

    Hive编程指南中文版翻译,Hive programing

    leetcode手册JAVA-test-programing-:测试-编程-

    只要它可以帮助正在学习新算法的人,它是否从某个地方复制并不重要。 图形示例也将非常有帮助。 不要忘记包括测试。 不要删除以前的算法实现。 只需使用您自己的实现添加一个新文件。 美化和清理您的代码以便于阅读...

    Programing with MFC Programing with MFC

    《Programming with MFC》是关于Microsoft Foundation Classes (MFC) 的编程指南,MFC 是微软为Windows应用程序开发提供的...通过深入学习MFC,开发者可以更好地理解和控制Windows应用程序的生命周期,提高开发效率。

    hive-programing

    直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = http'-f demo.hql #this用于将txt文件存储在azure中 直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = ...

    c++ programing and c

    c++ programingc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ ...

    Algorithm-competitive-programing.zip

    "Algorithm-competitive-programming.zip"这个压缩包文件,显然是为了帮助学习者深入理解和掌握算法以及如何在竞争编程中运用它们。让我们一起探讨其中蕴含的知识点。 1. **算法基础**:算法是一系列精确的步骤,...

    The C Programing language

    #### 2. C语言的基本结构 C语言程序通常由一个或多个源文件组成,每个源文件包含一个或多个函数定义。一个典型的C程序至少包含一个`main`函数,程序从`main`函数开始执行。 **示例代码:** ```c #include int ...

    programing-GIS:代码和笔记本

    通过深入研究这个"programing-GIS:代码和笔记本",学习者不仅可以掌握GIS编程的基本技能,还能了解如何将这些技能应用于实际问题,比如城市规划、环境保护、交通分析等领域。这将是一个宝贵的学习资源,帮助开发者将...

    Python-programing:Python代码

    以上只是Python编程中的一些基础知识点,Python的生态庞大,还有更多高级特性和框架,如网络编程、并发处理、网络爬虫、机器学习、深度学习等,都需要进一步深入学习。Python-programing-main这个压缩包可能包含了...

    牛客的代码leetcode代码区别-common_programing:common_programing

    2. 理解代码优化:比较不同解法,我们可以看到哪些代码更高效,哪些地方可以进行优化,这对于提升算法性能至关重要。 3. 规范编码习惯:观察他人的代码,我们可以吸收良好的编程习惯,如代码整洁、注释清晰等。 4. ...

    集体智慧编程原书代码-programing collective intelligence

    《集体智慧编程》是一本深入探讨如何利用网络和大规模数据来构建智能系统的经典著作。这本书主要关注的是如何通过编程技术来挖掘和利用互联网上的集体智慧,从而实现机器学习和人工智能的应用。书中涵盖了一系列的...

    web-programing:belajar tentang membuat网站sederhana

    压缩包中的"web-programing-main"可能包含了示例代码、练习项目和教程资源,供学习者实践和巩固所学知识。通过实际操作,你可以更好地理解如何将理论应用于实践中,创建自己的简单网站。 总的来说,这个课程将引导...

    Competitive-Programing:来自各种在线平台的问题解决方案

    安装依赖项npm install node filename.js Python python filename.py 不Leetcode 等级朗格公司再来1个简单的JavaScript 2个简单的JavaScript 3简单的JavaScript 4简单的JavaScript 5简单的JavaScript 6简单的...

    visualization-programing:这是个人毕业设计

    可视化编程是一种将编程过程与视觉元素相结合的技术,它允许用户通过图形化界面构建代码,而无需直接编写文本形式的程序。...对于学习者来说,它提供了深入理解TypeScript和可视化编程原理的机会。

    C++ Programing 编程思想

    第2章 数据抽象 22 第3章 隐藏实现 42 第4章 初始化与清除 55 第5章 函数重载与缺省参数 69 第6章 输入输出流介绍 83 第7章 常量 124 第8章 内联函数 142 第9章 命名控制 157 第10章 引用和拷贝构造函数 176

Global site tag (gtag.js) - Google Analytics