美文网首页
Hive编程指南:HQL 数据查询

Hive编程指南:HQL 数据查询

作者: luogps9 | 来源:发表于2020-03-15 22:35 被阅读0次

第六章 查询

1、map的数据类型存储,使用JSON格式来表达map,即使用一个被括在{..}内的以逗号分割的键

集合数据查询为 字段名[0] 字段名['xx'] 字段名.xx 等方式来引用

2、数学函数

floor(double d) 返回<=d的最大bigint型值 select floor(3.23) 返回 3
ceil(double d) 返回>=d 的最小bigint型值 select floor(3.23) 返回 4

3、集合函数

count():计算
avg():求列的平均值
sum():求列的和

variance():返回列的方差
stddev_pop(col):返回一组数值的标准偏差
covar_pop(col1,col2):返回一组数值的协方差
corr(col1,col2):返回两组数值的相关系数
percentile(bigint int_expr,p) :int_expr在p(范围是[0,1]处对应的百分比),其中p是一个double型数值
collecct_set(col):返回集合col元素排重后的数组

通常可以通过 set hive.map.aggr=true来提高聚合的性能
select count(*),avg(inv_amt) from dmt.user_inv_par_info_mon;

4、表生成函数

应用在array 或者map 型数值中

5、其他内置函数
cast(<expr> as <type>) # 将expr转换成type类型,如果转换失败,则返回Null
concat() #拼接字符串
concat_ws(string separator,str1,str2) # 指定分隔符,进行拼接
get_json_object(json_string,string_path) # 从给定路径上的JSON字符串中抽取出JSON对象
regexp_extract(subject,regex_pattern,index): # 抽取字符串subject中符合正则表达式regex_pattern的第index个部分的子字符串

regexp_replace():正则表达式进行替换

to_date(string timestamp) 返回时间字符串的日期部分

weekofyear(string date) 返回时间字符串位于一年中的第几个周内
datediff(string enddate,string startdate):时间相差的天数

6、通过设置set hive.exec.mode.local.auto=true 可以使用本地模式来进行查询,而不触发mapreduce任务

7、对浮点数进行比较时,需要保持极端谨慎的态度,要避免任何从窄类型隐式转换到更广泛类型的操作。和钱相关的都避免使用浮点数

8、rlike正则表达式匹配需要查找的条件表达式

9、having 语句允许用户通过一个简单的语法完成原本需要通过子查询才能对group by 语句产生的分组进行条件过滤的任务

10、join

大多数情况下,hive会对每个join对象启动一个mapreduce任务,当有三个表join时,先启动一个mapreduce任务进行连接操作,然后再启动一个mapreduce任务将第一个mapreduce的输出和表c进行连接操作

11、join优化

提示:当对3个或者更多个表进行join连接时,如果每个on字句都使用相同的连接键的话,那么只会产生一个mapreduce job。
Hive同时假定查询中最后一个表是最大的那个表。在对每行记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后那个表进行计算。因此,用户需要保证连续查询中的表的大小从左到右是依次增加的。

用户可以显式指定哪张表是大表;
select /* +STREAMTABLE(S)/ S.
from stocks s
join dividends d
on s.id = d.id

对于外连接(outer join)会忽略掉分区过滤条件

left semi-join :左半开连接,会返回左边表的记录,前提是其记录对于右边表满足on语句中的判定条件,相当于其他sql语言中的 where字句中的 In 和 exists操作,是其更高效的一种表现。
原因如下:对于左边表中一条指定的记录,在右边表中一旦找到匹配的记录,hive就会停止扫描

select a.*
from dmt.user_inv_par_info_mon a
left semi join dmt.user_inv_info_mon b
on a.user_id = b.user_id
;

select a.*
from dmt.user_inv_par_info_mon a
where user_id in (select user_id from dmt.user_inv_info_mon )
;

12、order by 和 sort by

order by 是在reducer过程执行的全局排序
sort by 只会在每个reducer 中对数据进行排序,也就是执行一个局部排序过程,这样可以保证每个reducer的输出数据都是有序的,但并非全局有序,可以提高后面进行的全局排序的效率。

select *
from dmt.user_inv_par_info_mon
sort by inv_amt desc;

13、含有sort by 的 distribute by

distribute by 控制map的输出在reducer中是如何划分的。mapreduce job中传输的所有数据都是按照键-值对的方式进行组织的,因此hive在将用户的查询语句转换成mapreduce job时,其必须在内部使用这个功能
hive 要求distribute by语句要写在sort by 语句之前,可以实现输出的文件数据是全局排序的,

14、cluster by
可以代替 distribute by 和 sort by的组合写法

15、hive抽样查询

hive 可以通过对表进行分桶抽样来满足这个要求,可以使用rand()函数进行抽样

select * from dmt.user_inv_par_info_mon tablesample(bucket 3 out of 10 on rand()) ;

也可以指定列名
select * from dmt.user_inv_par_info_mon tablesample(bucket 1 out of 2 on user_id) ;

(2)数据块抽样
hive提供了一种按照抽样百分比进行抽样的方式,这种是基于行数的,按照输入路径下的数据块百分比进行的抽样;

select * from dmt.user_inv_info_mon tablesample(0.1 percent) ;

需要注意的是:这种抽样方式并不一定适用于所有的文件格式,另外,这种抽样的最小抽样单元是一个hdfs数据块。因此如果表的数据大小小于普通的块128mb的话,将会返回所有的行。

相关文章

  • Hive编程指南:HQL 数据查询

    第六章 查询 1、map的数据类型存储,使用JSON格式来表达map,即使用一个被括在{..}内的以逗号分割的键 ...

  • 2017年10月24日

    大数据系统基础 4.7-4.14《Hive编程指南》第1章《Hive编程指南》第2章《Hive编程指南》第3章

  • HiveSQL 与 SQL 的区别

    Hive采用了类SQL的查询语言HQL (hive query language)。除了HQL之外,无任何相似的地...

  • 2017年10月26

    《Hive编程指南》第4章《Hive编程指南》第5章《Hive编程指南》第6章《Hive编程指南》第7章

  • 大数据之数据仓库,Hive仓库的数据类型

    刚毕业那会用过hive,后面就很少使用hive,对hive只停留在Hql查询的操作中。最近,在建设数据仓库的过程中...

  • Hibernate继续进阶之hql语句和QBC查询

    Hibernate--hql语句查询 HQL查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员...

  • Hive的架构剖析

    本文主要介绍Hive的架构和以及HQL的查询阶段,主要内容包括: Hive的架构 架构中的相关组件介绍 HQL的查...

  • Hive编程指南读书笔记0001

    Hive概述 1.Hive提供了一个被称为Hive查询语言(简称HiveQL或HQL)的SQL方言,来查询存储在H...

  • hive报错

    1、HQL子查询别名问题报错:hive query failed cannot recognize input n...

  • Hive学习-表的基本操作

    Hive QL是类SQL查询语句,和数据库的查询语句类似,下面介绍一些基本的表操作: 1. 创建表 创建表的HQL...

网友评论

      本文标题:Hive编程指南:HQL 数据查询

      本文链接:https://www.haomeiwen.com/subject/lncmfhtx.html