【HQL】函数汇总

背景 SQL几乎是初级分析师80%的工作内容,当然在我的规划里,中级分析师已经要做好维度建模工作以及最好有OLAP系统工具啥的,或者已经能主动分析写文章了,尽量减少SQL的无效使用。这是我自己的定位,其他人无所谓。
anyway,SQL对分析师来说是一项很棒的工具,HQL即Hive SQL,相对MySQL 函数更多更复杂一些。
另外,在查询能使用哪个函数时,通常有三种情况:
一是记得某个函数名,但忘了参数怎么用,索引是函数名;
二是想要实现某个目的,不太清楚有什么函数能实现,索引是函数的作用;
三是想实现某个较为复杂的目的,不太清楚组合哪些函数能实现,这里通常涉及多个函数,索引是使用案例。
所以在后续文章中,前三列会体现这个问题。

数仓同步表

与MySQL这种事务性数据库不同的是,数据仓库是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。前三个性质且不说,最后一个反映历史变化的是如何体现的呢?这在于同步线上事务表的方式。
线上表同步下来有三种方式,增量表、全量表、拉链表。
另外提一下,数仓都是在凌晨两三点T+1同步;除了字段外,数仓还有个分区的概念,用于快速取某一块的数据,通常日期dt会作为分区,其他例如业务类型啥的也可以作为分区,分区可以理解为是一种方便快速取数的索引。查看表分区的语句是
`show partitions 库名.表名`
##增量表##
很好理解,增量表即在第一天全量同步线上事务表到昨天的分区,之后每天只同步那些创建时间、更新时间是昨天的记录到昨天的分区。
如果某些表不会对记录进行更新,比如日志,进行增量同步就正常使用即可;如果某些表会对记录进行更新,那么取当前状态就必须对记录主键ID按更新时间排序取最后一条记录;取历史某一天快照就限制dt<=那天取最后一天记录;取每天的状态就需要辅助日期表left join on 1=1 where 日期表.dt<=增量表.dt,再对记录按辅助日期表日期和更新时间排序,取辅助日期表日期的最后一条更新记录作为每天状态即可。
##全量表##
也很好理解,即每天都把线上事务表数据同步到昨天的分区。
取当前状态直接取昨天分区,取历史某一天快照就限制dt=那一天即可,取每一天状态限制dt在需要的一段时间即可。
##拉链表##
较难理解,其线上事务表通常是会对记录进行更新的,线下表通常有三个分区,dp、start_date(或dt)、end_date。dp有两个值,ACTIVE和EXPIRED,分别表示有效和过期,即该记录当前是有效的状态和该记录是过期的记录(历史的状态);start_date表示该记录从哪一天开始有效,end_date表示该记录从哪一天无效。
拉链表在同步的第一天全量同步线上事务表(同步的第一天是无法保留该天之前的状态的),之后的每天会把新纪录(一般创建时间是昨天)直接同步(dp=‘ACTIVE’ and start_date=昨天 and end_date='9999-12-31'),把老记录但有更新(通常创建时间更早,更新时间是昨天)的老记录设置为(dp=‘EXPIRED’ and end_date=昨天)并新增一条更新后记录(dp=‘ACTIVE’ and start_date=昨天 and end_date='9999-12-31')。
所以拉链表取当前状态只需要限制dp=‘ACTIVE’(或者start_date <=昨天 and end_date >昨天)即可;取历史某一天的状态限制start_date <=那一天 and end_date >那一天(这可能较难理解,可以停下来思考一下);取每一天状态限制
#常用函数

常用函数
函数&案例 函数名 函数作用 参数 理解 使用举例
           
           
           
           
           

#使用案例

##COALESCE
COALESCE(T v1, T v2, …)
返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL
#高阶函数

#函数大全

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

猜你喜欢

转载自www.cnblogs.com/everda/p/11237370.html
HQL
今日推荐