【HQL】HQL汇总

一、背景


  SQL几乎是初级分析师80%的工作内容,当然在我的规划里,中级分析师已经要做好维度建模工作以及最好有OLAP系统工具啥的,或者已经能主动分析写文章了,尽量减少SQL的无效使用。这是我自己的定位,其他人可能不一样。

  anyway,SQL对分析师来说是一项很棒的工具。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。[1]HQL即Hive SQL,相对MySQL 函数更多更复杂一些。
  在查询能使用哪个函数时,通常有三种情况:
  1)记得某个函数名,但忘了参数怎么用,索引是函数名;

  2)想要实现某个目的,不太清楚有什么函数能实现,索引是函数的作用;

  3)想实现某个较为复杂的目的,不太清楚组合哪些函数能实现,这里通常涉及多个函数,索引是使用案例。

  所以在后续汇总表中,前四列会体现这个问题。

  本篇文章主要介绍几个部分:

  1)数仓同步表与事务型数据库表的不同;

  2)HQL语法;

  3)工作中常用到的函数;

  4)以使用案例作为函数作用名的案例汇总;

  5)比较高阶的函数;

  6)对照官网函数手册汇总的函数大全。

二、数仓同步表


  与MySQL这种事务型数据库不同的是,数据仓库是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。前三个性质且不说,最后一个反映历史变化的是如何体现的呢?这在于同步线上事务表的方式。
  线上表同步下来有三种方式,增量表、全量表、拉链表。
  另外提一下,数仓都是在凌晨两三点T+1同步;数据表除了字段外,数仓还有个分区的概念,用于快速取某一块的数据,通常日期dt会作为分区,其他例如业务类型啥的也可以作为分区,分区可以理解为是一种方便快速取数的索引。查看表分区的语句是

show partitions 库名.表名

View Code

增量表

  增量表即在第一天全量同步线上事务表到昨天的分区,之后每天只同步那些创建时间、更新时间是昨天的记录到昨天的分区。
  如果某些表不会对记录进行更新,比如日志,进行增量同步就正常使用即可;

  如果某些表会对记录进行更新,那么取当前状态就必须对记录主键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 >那一天(这可能较难理解,start_date <=那一天表示去除这天之后同步的新记录,end_date >那一天表示去除这天之前过期的);

  取每一天状态就需要辅助日期表left join on 1=1 where 日期表.dt<=增量表.start_date and end_date>日期表.dt,以辅助表日期作为每天状态即可。

三、语法


四、常用函数


注:F&C指的是函数或使用案例,只是本文的设定。

常用函数
F&C 分类 作用 函数名 语法 参数 返回 理解 应用场景 使用例子
 F 通用  返回多个值中第一个非空值

coalesce

coalesce(expression_1, expression_2, ...,expression_n) n个字符串或表达式 第一个非空值 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL

1)不希望字段显示NULL,设一个默认值;2)一个目标值可能在多个地方,取出来多个值返回不为空的一个。

 
 F 聚合 列值合并成一个集合(去重) collect_set collect_set (col)  某字段名 数组 将某列值去重后,以逗号分隔合并成一个数组 1)参加哪些活动组合、买过哪些商品组合、浏览过哪些模块组合的用户分布;2)用于手动计算活动重合率。  
 F 聚合  列值合并成一个集合(不去重) collect_list collect_list(col)  某字段名 数组 将某列值以逗号分隔合并成一个数组 1)用于聚合用户前n个行为路径  
 F 数组函数  对数组升序排序 sort_array sort_array(Array<T>) 数组 数组 对数组升序排序 1)对collect_set出来的数组排序  
 数值函数 取余数 pmod  pmod(int a, int b),pmod(double a, double b)  被除数,除数 余数   返回正的a除以b的余数 1)在ab测试中辅助取用户尾号积偶数;2)取指定余数。  
F 日期函数 返回下一个星期X对应的日期 next_day next_day(string start_date, string day_of_week) 日期,指定星期X 下一个周几 返回日期的下一个星期X对应的日期,其中day_of_week参数可以是星期X英语的前2个、3个或全写的大写字符 1)hive给定函数getweek是周日-周六为一周,想要周一-周日为一周,只需指定下周一的日期即可(每周一至周日都会返回下一周的周一日期)。 date_sub(next_day('2019-03-03','MONDAY'),1)

五、使用案例


注:本节以“使用目的”作为索引写在“作用”一列上。

使用案例
F&C 分类 作用 函数名 语法 参数 返回 理解 应用场景 使用例子
C 日期函数 返回星期几

pmod,datediff

pmod(datediff(dt, '2019-02-11'), 7)+1 '2019-02-11'是随意设置的某个比dt小的周一的日期,dt是指定的日期 1-7 首先datediff求出指定日期与之前某个周一的间隔日期,再除以7取余数得到0-6,最后+1即映射到周一-日

1)指定取星期几;

2)需要表头显示星期几

 
C 日期函数 时间戳返回日期格式

from_unixtime,cast

from_unixtime(cast(substring(updatetime,1,10) as bigint),'yyyy-MM-dd HH:mm:ss') as updatetime  updatetime是输入的时间戳列名 日期格式 from_unixtime(bigint unixtime[, string format]) 将bigint型时间戳转化为指定format的日期,cast将时间戳字符串转化成bigint型

1)经常遇到HDFS里存的时间格式是字符串型的时间戳,需要转为日期格式

 

六、高阶函数


1.窗口和分析型函数

窗口和分析型函数解决的是时间序列相关的系列问题,比如每个城市

2.复杂JSON解析

参考资料:[2] [3][4]

七、函数大全


英文网址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

中文参考:https://www.cnblogs.com/MOBIN/p/5618747.html

后续会整理出中文大全。

八、案例附录


参考资料:

[1].会飞的猪仔.Hive详解

[2].yugouai.HIVE 窗口及分析函数 应用场景

[3].张吉的博客.Hive 窗口与分析型函数

[4].官网.LanguageManual WindowingAndAnalytics (讲真,官网太水了)

posted on 2019-07-24 13:18  everda 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/everda/p/11237370.html

【HQL】HQL汇总相关推荐

  1. hibernate mysql 时间比较_Hibernate中HQL函数汇总及获取当前时间进行比较举例

    在很多时候,我们负责的项目中,在数据访问层(DAO层)通常我们会使用sql语句或者hql语句,而在我们使用hql语句拼接时有时会报错,通常的原因是:我们使用了标准的sql语句,开启的确是hiberna ...

  2. Hibernate中HQL函数汇总及其说明

    2019独角兽企业重金招聘Python工程师标准>>> Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lang ...

  3. hibernate教程--检索方式详解(hql,sql,QBC)

    1.1 Hibernate的检索方式 1.1.1 Hibernate的检索方式: 检索方式:查询的方式: 导航对象图检索方式:  根据已经加载的对象导航到其他对象 * Customer custome ...

  4. Hibernate之检索方式(HQL/QBC/本地SQL)

    一.概述 Hibernate提供了以下几种检索对象的方式 导航对象图:根据已经加载的对象导航到其它对象 OID:按照对象的OID来检索对象 HQL:使用面向对象的HQL查询语句 QBC:使用QBC(Q ...

  5. 【Hibernate】Hibernate查询语言HQL详解

    常用的HQL语句 HQL: Hibernate Query Language. 特点: 1,与SQL相似,SQL中的语法基本上都可以直接使用. 2,SQL查询的是表和表中的列:HQL查询的是对象与对象 ...

  6. hql Hibernate.gethibernatetemplate()

    1. find(String hql);  //普通查询 示例:this.gethibernateTemplate().find("from User"); 2. find(Str ...

  7. HQL - Hibernate查询语言 - 示例教程

    HQL - Hibernate查询语言 - 示例教程 HQL或Hibernate查询语言是Hibernate Framework的面向对象查询语言.HQL与SQL非常相似,只是我们使用Objects而 ...

  8. HQL –Hibernate查询语言–示例教程

    HQL or Hibernate Query Language is the object-oriented query language of Hibernate Framework. HQL is ...

  9. 391、Java框架46 -【Hibernate - 查询HQL、查询Criteria、查询标准SQL】 2020.10.19

    0.目录 1.HQL 2.使用HQL,根据name进行模糊查询 3.查询Criteria 4.使用Criteria,根据name进行模糊查询 5.查询-标准SQL 6.使用标准SQL,根据name进行 ...

  10. Hibernate之HQL

    目录 1.什么是hql 2.hql和sql区别/异同 3.案例 1.什么是hql HQL是Hibernate Query Language的缩写 2.hql和sql区别/异同 HQL SQL 类名/属 ...

最新文章

  1. mysql数据库建表失败_mysql数据库文件太大导致建表失败,如何避免
  2. Linux 查看软件位置的命令
  3. 用平方映射理解tanh
  4. cus.crm.notes.Component.extend(cus.crm.notes.ext.Component, {
  5. 全国计算机等级考试题库二级C操作题100套(第03套)
  6. 7-41 PAT排名汇总 (25 分)(详解+思路+重写sort函数)兄弟们冲呀呀呀呀呀呀呀
  7. java hibernate 分页取数_java – Hibernate分页机制
  8. 【java】静态代理 proxy
  9. Python numpy学习笔记(一)
  10. Python中的X[:,0]和X[:,1]
  11. 学习笔记: 委托解析和封装,事件及应用
  12. Android11新版本,一加8系列喜提Android11稳定版更新
  13. 工作没做好,别人指出时最好装聋作哑
  14. Mysql授权root账户允许远程连接访问
  15. 计算机232接口接线,RS232接口
  16. 安装WIN8提示Error Code:0x0000005D的解决办法
  17. docker打包镜像--go语言编写的http项目
  18. edk2中的fdf文件简介
  19. 微信小程序ocr身份证扫描
  20. 国际版抖音加群 振兴中华

热门文章

  1. 讲的真详细!如何成为一个更好的Android开发者?成功入职腾讯
  2. NTS-Net复现出bug
  3. 求一个给定的n阶方阵的鞍点
  4. TensorFlow实践项目的报告
  5. gazebo mesh尝试dae
  6. php 可视化编辑建站源码,CmsEasy可视化编辑商城系统 v7.3.1
  7. 5种创建Dataframe方法
  8. Idx推出AI系统检测糖尿病视网膜病变
  9. final finally finalize三者有什么区别
  10. 「首席架构师推荐」React生态系统大集合