- 查询语句
上面两个语句是等价的,只是下面的用到了表的别名。
对于集合类型,Hive会以JSON形式输出,对于数组可以使用name[0]
的形式引用,如
同理,对于MAP元素,可以使用map['name']
引用,可以使用.
点符号引用STRUCT类型。 - 使用正则表达式指定列
- 使用列值进行计算
- 算术运算符
内置函数
- 数学函数:
- 聚合函数
聚合函数是比较特殊的函数,它们对多行进行计算,然后得到一个结果值,如
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:
内置生成函数:
- 数学函数:
- 其他内置函数
- LIMIT:限制返回的行数
- 列别名
有时候对查询结果进行某些操作后,其与原列已经不同,有必要给其取一个别名
- 嵌套查询
可以看出,取别名在嵌套查询中是十分必要的。 - CASE..WHEN…THEN
和if语句类似
- 什么情况Hive可以避免MapReduce
SELECT * FROM employees;
这种情况Hive会简单的读取employees对应的存储目录
对于过滤条件只是分区字段的情况,也无需MapReduce过程
记住,设置set hive.exec.mode.local.auto=true
到$HOME/.hiverc
配置文件中。 - WHERE 语句
WHERE语句中不能使用别名:
但是可以通过嵌套查询语句来解决:
- 谓词操作符
这些操作符可以用于JOIN...ON
和HAVING
语句中 - 浮点数比较
为什么会出现0.2? 因为我们定义的deductions为FLOAT型,在IEEE标准中FLOAT其表示为’0.200001’,但Hive中浮点数默认为DOUBLE型,这里的0.2实为0.20000000000000001
通过强制类型转换解决
- LIKE和RLIKE
- GROUP BY语句
- HAVING语句
允许用户通过简单的语法完成原本需要通过查询才能对GROUP BY产生的分组进行条件过滤的任务:
原本需要如下嵌套查询:
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
来启动这个优化:
- 内连接(INNER JOIN):只有连接两端都满足条件的行才会保留下来。
- ORDER BY 和 SORT BY
- 含有SORT BY的DISTRIBUTE BY
- CLUSTER BY
- 类型转换:cast函数
- 抽样查询
- 按数据块抽样
- 按数据块抽样
- UNION ALL
将两个或多个表进行合并
HIVE:3_HIVEQL
最新推荐文章于 2024-05-22 15:25:18 发布