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

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

    博客分类:
  • Hive
阅读更多
        前几章已经学习过Hive表的定义和数据操纵,本章我们开始学习HiveQL查询。
        SELECT ... FROM ...查询
        SELECT在SQL中是一个投影操作。让我们从新来看之前定义过的分区表employees:
              CREATE TABLE employees (  
                name STRING,  
                salary FLOAT,  
                subordinates ARRAY<STRING> COMMENT '下属',  
                deductions MAP<STRING,FLOAT> COMMENT '扣费',  
                address STRUT<street:STRING,city:STRING,state:STRING,zip:INT>  
              )  
              PARTITIONED BY(country STRING,state STRING); 
        

        SELECT查询:
              hive> SELECT name,salary FROM employees;
              John Doe      100000.0
              Mary Smith     80000.0
              Todd Jones     70000.0
              Bill King      60000.0
        

        用户也可以给FROM之后的表,视图或子查询起一个别名,如:
              hive> SELECT e.name,e.salary FROM employees e;
        

        上面两个HiveQL语句是相同的,给表起别名在JOIN操作中特别有用。
        下面我们来看如何查询employees表中的集合类型的数据。我们先看一下如何查询ARRAY类型的数据,如employees表的下属“subordinates”
              hive> SELECT name,subordinates FROM employees;
              John Doe     ["Mary Smith","Todd Jones"]
              Mary Smith   ["Bill King"]
              Todd Jones   []
              Bill king    []
        

        再看MAP类型的查询,如“deductions”:
              hive> SELECT name,deductions FROM employees;
              John Doe   {"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}
              Mary Smith {"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}
              Todd Jones {"Federal Taxes":0.15,"State Taxes":0.03,"Insurance":0.1}
              Bill King  {"Federal Taxes":0.15,"State Taxes":0.03,"Insurance":0.1}
        

        再看STRUCT类型的查询,如“address”:
              hive> SELECT name,address FROM employees;
              John Doe   {"Street":"1 Michign Ave.","city":"Chicago","State":"IL","ZIP":60600}
              Mary Smith {"Street":"100 Ontario St.","city":"Chicago","State":"IL","ZIP":60601}
              Todd Jones {"Street":"200 Chicago Ave.","city":"Oak Park","State":"IL","ZIP":60700}
              Bill King  {"Street":"300 Obscure Dr.","city":"Obscuria","State":"IL","ZIP":60100}
        

        接下来我们再看如何查看集合性属性字段中的数据:
              hive> SELECT name,subordinates[0],deductions["State Taxes"],address.city FROM employees;
              John Doe    Mary Smith  0.05  Chicago
              Mary Smith  Bill King   0.05  Chicago 
              Todd Jones  NULL        0.03  Oak Park
              Bill King   NULL        0.03  Obscuria
        


        使用正则表达式查询符合条件的列
        在Hive查询中,用户可以使用正则表达式查询符合条件的列,下面的实例中就是使用正则表达式的使用用例,可以查询到symbol列和所有以“price”开头的列:
              hive> SELECT symbol,'price.*' FROM stocks;
              AAPL  195.69  197.88  194.0  194.12  194.12
              AAPL  192.63  196.0   190.85  195.46  195.46
              AAPL  196.73  198.37  191.57  192.05  192.05
              AAPL  195.17  200.2   194.42  199.23  199.23
              AAPL  195.91  196.32  193.38  195.86  195.86
              ...
        


        列计算
        在HiveQL中,用户不但可以从表中查询某些列,还可以通过函数或数学表达式来计算列的值。例如,我们可以在employees表中查询雇员的姓名,薪水,联邦税百分百及其他列的值:
              hive> SELECT upper(name),salary,deductions["Federal Taxes"],
                  > round(salary * (1 - deductions["Federal Taxes"])) 
                  > FROM employees;
              JOHN DOE    100000.0  0.2   80000
              MARY SMITH   80000.0  0.2   64000
              TODD JONES   70000.0  0.15  59500
              BILL KING    60000.0  0.15  51000
        

        Hive是使用JAVA写的开源软件,在函数或数学表达式来计算列的值时类型转型和JAVA的转型相同。

        聚合函数
        要在HiveQL查询中使用聚合函数,必须先将hive.map.aggr配置参数设置为true,举例如下:
              hive> SET hive.map.aggr=true;
              hibe> SELECT count(*),avg(salary) FROM employees;
        

        但是将
hive.map.aggr
设置为true会占用更多的内存。

        LIMIT
        一次典型的HiveQL查询可能会返回所有符合条件的数据记录,但是LIMIT关键字可以限制返回的记录的条数:
              hive> SELECT upper(name),salary,deductions["Federal Taxes"],
                  > round(salary * (1 - deductions["Federal Taxes"])) 
                  > FROM employees 
                  > LIMIT 2;
              JOHN DOE    100000.0  0.2   80000
              MARY SMITH   80000.0  0.2   64000
        

       
        给列奇别名
       
              hive> SELECT upper(name),salary,deductions["Federal Taxes"] AS
                  > fed_taxes,round(salary * (1 - deductions["Federal Taxes"])) AS
                  > salary_minus_fed_taxes
                  > FROM employees 
                  > LIMIT 2;
              JOHN DOE    100000.0  0.2   80000
              MARY SMITH   80000.0  0.2   64000
        


        子查询
        给列起别名特别适合与子查询中的列,让我们将上个查询示例修改为子查询的使用用例:
              hive> FROM(
                  >   SELECT upper(name),salary,deductions["Federal Taxes"] AS
                  >   fed_taxes,round(salary * (1 - deductions["Federal Taxes"])) 
                  >   AS salary_minus_fed_taxes
                  >   FROM employees
                  > ) e
                  > SELECT e.name,e.salary_minus_fed_taxes
                  > WHERE e.salary_minus_fed_taxes > 70000;
               JOHN DOE    100000.0  0.2   80000
        


        CASE ... WHEN ... THEN语句
        CASE ... WHEN ... THEN向标准的SQL语句中一样使用在SELECT列中,对某一个猎德返回值做判断,示例如下:
              hive> SELECT name,salary,
                  >   CASE
                  >     WHEN  salary < 50000.0 THEN 'low'
                  >     WHEN  salary >= 50000.0 AND salary < 70000.0 THEN 'middle'
                  >     WHEN  salary >= 70000.0 AND salay < 100000.0 THEN 'high'
                        ELSE 'very high'
                  >   END AS bracket FROM  employees;
                  John Doe        100000.0  very high         
                  Mary Smith       80000.0  high
                  Todd Jones       70000.0  high
                  Bill King        60000.0  middle
                  Boss Man        200000.0  very high
                  Fred Finance    150000.0  very high
                  Stcy Accountant  60000.0  middle
        


        WHERE过滤条件
        SELECT决定返回哪些数据列,而WHERE决定返回那些符合条件的数据:
               hive> SELECT name,salary,deductions["Federal Taxes"],
                   >   salary * (1 - deductions["Federal Taxes"])
                   > FROM employees
                   > WHERE round(salary * (1 - deductions["Federal Taxes"])) >  
                   >  70000;
              John Doe   100000.0  0.2  80000.0
        

        该示例有一个问题,那就是salary * (1 - deductions["Federal Taxes"])分别在SELECT部分和WHERE部分都执行了,性能上不是多优化。那么,对salary * (1 - deductions["Federal Taxes"])使用别名能否消除这种冲突呢?,不幸的是这是无效的:
               hive> SELECT name,salary,deductions["Federal Taxes"],
                   >   salary * (1 - deductions["Federal Taxes"]) AS 
                   >   salary_minus_fed_taxes
                   > FROM employees
                   > WHERE round(salary_minus_fed_taxes) >  70000;
              FAILED:Error in semantic analysis: Line 4:13 Invalid table alias or 
              colomn reference 'salary_minus_fed_taxes': (possible colomn names  
              are: name,salary,subordinates,deductions,address)
        

        如错误信息中所说,用户不能在WHERE部分中引用列的别名,那么我们是否可以使用其他办法来消除这种冲突呢?答案是使用子查询:
              hive> SELECT e.* FROM
                  > (SELECT name,salary,deductions["Federal Taxes"] AS ded,
                  >    salary * (1 - deductions["Federal Taxes"]) AS 
                  >    salary_minus_fed_taxes
                  >  FROM employees) e
                  > WHERE round(salary_minus_fed_taxes) >  70000;
        
分享到:
评论

相关推荐

    HIVE编程指南

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

    Programing1:编程的最终评估1

    在编程领域,编程1通常指的是初学者阶段的学习与实践,主要涵盖了基础的编程概念、语法和逻辑思维。在这个“编程的最终评估1”中,我们可以期待一个总结性的任务或者项目,目的是检验学习者对基本编程知识的理解和...

    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

    根据提供的文件信息,实际内容与要求的C编程语言知识点不符,该文件内容为一份小品剧本,因此将基于剧本中的元素进行无关内容的剔除,接下来将围绕...掌握这些基础概念对于学习更高级的语言和技术也是非常有帮助的。

    programing-GIS:代码和笔记本

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

    Python-programing:Python代码

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

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

    1. 学习不同的解题策略:每个平台可能有其特定的解题风格,了解这些风格可以帮助我们拓宽思维,找到更适合特定问题的解决方案。 2. 理解代码优化:比较不同解法,我们可以看到哪些代码更高效,哪些地方可以进行优化...

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

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

    web-programing:belajar tentang membuat网站sederhana

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

    C++ Programing 编程思想

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics