HIVE:3_HIVEQL

  1. 查询语句

    上面两个语句是等价的,只是下面的用到了表的别名。
    对于集合类型,Hive会以JSON形式输出,对于数组可以使用name[0]的形式引用,如

    同理,对于MAP元素,可以使用map['name']引用,可以使用.点符号引用STRUCT类型。
  2. 使用正则表达式指定列
  3. 使用列值进行计算
  4. 算术运算符
  5. 内置函数

    • 数学函数:


    • 聚合函数
      聚合函数是比较特殊的函数,它们对多行进行计算,然后得到一个结果值,如
      hive > SELECT count(*), avg(salary) FROM employees;计算employees表有多少雇员及平均薪水。,后面讨论GROUP BY时将会看到其他例子。


      可以通过设置SET hive.map.aggr=true来提高聚合的性能。
    • 表生成函数
      与聚合函数相反,表生成函数,可以将单列扩展成多列或多行.例如,将employees中每行记录的subordinates(下属)字段内容扩展成0个或多个记录行:SELECT explode(subordinates) AS sub FROM employees;
      select id, name, explode(address) as address from user_info;

      这样做是不对的, UDTF's are not supported outside the SELECT clause, nor nested in expressions

      所以我们需要这样做:

      select id, name, add from user_info ui lateral view explode(ui.address) adtable as add;
      

      当使用表生成函数时,Hive要求使用列别名
      解析URL:

      内置生成函数:

  6. 其他内置函数




  7. LIMIT:限制返回的行数
  8. 列别名
    有时候对查询结果进行某些操作后,其与原列已经不同,有必要给其取一个别名
  9. 嵌套查询

    可以看出,取别名在嵌套查询中是十分必要的。
  10. CASE..WHEN…THEN
    和if语句类似
  11. 什么情况Hive可以避免MapReduce
    SELECT * FROM employees;
    这种情况Hive会简单的读取employees对应的存储目录
    对于过滤条件只是分区字段的情况,也无需MapReduce过程

    记住,设置set hive.exec.mode.local.auto=true$HOME/.hiverc配置文件中。
  12. WHERE 语句

    WHERE语句中不能使用别名:

    但是可以通过嵌套查询语句来解决:
  13. 谓词操作符

    这些操作符可以用于JOIN...ONHAVING语句中
  14. 浮点数比较

    为什么会出现0.2? 因为我们定义的deductions为FLOAT型,在IEEE标准中FLOAT其表示为’0.200001’,但Hive中浮点数默认为DOUBLE型,这里的0.2实为0.20000000000000001
    通过强制类型转换解决
  15. LIKE和RLIKE

  16. GROUP BY语句
  17. HAVING语句
    允许用户通过简单的语法完成原本需要通过查询才能对GROUP BY产生的分组进行条件过滤的任务:

    原本需要如下嵌套查询:
  18. JOIN语句
    Hive只支持等值连接,不支持在ON语句中使用OR

    • 内连接(INNER JOIN):只有连接两端都满足条件的行才会保留下来。
    • JOIN优化
      Hive会假定查询中最后一张表是最大的一张表,在对记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后一张表进行计算。因此,用户需要保证连续查询中的表的大小从左到右是依次递增的。
      也可以通过标记来告诉Hive哪张表最大:
    • LEFT OUTER JOIN
      会返回左边表的所有符合WHERE的记录,右边表如果没有符合ON后面条件的记录的话,右边指定表的列的值将会是NULL:
    • LEFT SEMI-JOIN
      Hive会返回左边表的的记录,前提是其记录对于右边表满足ON语句中的判定条件。
      Hive不支持IN...EXISTS结构,如:

      但是可以给通过LEFT SEMI JOIN来达到同样效果。

    • RIGHT OUTRT JOIN
      类似左外连接

    • OUTER JOIN
      返回左表和右表的所有行,如果其中一张表没有另一张表对应行,则该行NULL
    • 笛卡尔积JOIN
      SELECT * FROM stocks JOIN dividends;左边的表的行数,乘以右边的表的行数等于笛卡尔积的大小
    • map-side JOIN
      如果只有一张表是小表,那么在最大表通过mapper的时候将小表完全放到内存中,Hive可以和在内存中小表进行逐一匹配,从而省略常规操作的reduce过程,通过设置set来启动这个优化:
  19. ORDER BY 和 SORT BY
  20. 含有SORT BY的DISTRIBUTE BY
  21. CLUSTER BY
  22. 类型转换:cast函数
  23. 抽样查询

    • 按数据块抽样
  24. UNION ALL
    将两个或多个表进行合并

你可能感兴趣的:(HIVE:3_HIVEQL)