1.多行合并

多行合并常用于做区间统计,通过定义一定的金额区级,将上亿的记录降维为不同区间内总数。概括来说就是多映射到一。

典型场景:

基于用户交易天流水,计算每天不同金额段的金额笔数。

如用户的天交易流水表结构如上,需要计算出交易额在0-100,100-200,200-300,大于300几个区级的笔数,

CREATE VIEW t_deal_tmp_view_1 AS

SELECT

CASE

WHEN rcv_amount <= 100 THEN 1

WHEN rcv_amount <= 200 THEN 2

WHEN rcv_amount <= 300 THEN 3

ELSE 4 END AS amount_range,

receiver

FROM t_transfer_info

SELECT

amount_range,

COUNT(receiver) AS cnt

FROM t_deal_tmp_view_1

GROUP BY amount_range

DROP VIEW t_deal_tmp_view_1

为什么不使用下面这种写法

SELECT

CASE

WHEN rcv_amount <= 100 THEN 1

WHEN rcv_amount <= 200 THEN 2

WHEN rcv_amount <= 300 THEN 3

ELSE 4 END AS amount_range,

COUNT(receiver)

FROM t_transfer_info

GROUP BY

CASE

WHEN rcv_amount <= 100 THEN 1

WHEN rcv_amount <= 200 THEN 2

WHEN rcv_amount <= 300 THEN 3

ELSE NULL END

这种写法会报Expressio Not In Group By Key 的错误,在hive中,

使用Group By时,非Group By的字段必须使用聚合函数,只有Group By的字段才能原值取出。主要原因是上面在Group By后面使用Case When没方法命名新字段。

因此需要使用临时view进行处理。

2.使用条件语句将NULL转为0

在hive的表中,有些记录可能是NULL,这时如果我们直接对这条记录做运算或逻辑判断是得不到我们期望的结果的,这里可以将NULL转换为0再做处理。

当然NULL转0可以使用hive现成的函数nvl,这里使用CASE WHEN是想介绍在hive sql里条件语句的用法。

如上表记录用户每天的收入以及支出,每天的收入和支出可能为空,需要计算用户连续两天的总收入以及总支出。

使用join将两天的表链接进行计算,对于NULL使用替换为0,sql如下:

SELECT

t1.uin,

t1.income + CASE WHEN t2.income IS NULL THEN 0 ELSE t2.income END AS income,

t1.expend + CASE WHEN t2.expend IS NULL THEN 0 ELSE t2.expend END AS expend

FROM

(

SELECT

uin,

income,

expend

FROM t_user_trans_inf_day

WHERE statis_day=20180812

)t1

LEFT JOIN

(

SELECT

uin,

income,

expend

FROM t_user_trans_inf_day

WHERE statis_day=20180811

)t2

ON(t1.uin=t2.uin)

3.列传行

如有一个表A,如上,记录了用户的消费记录,每类消费一列,现在需要将该表的列转化为行,如表B,原来的多列转化为多行。

如下

这里有两种方式可以实现,分布是使用union以及posexplode。

方法一 使用union

union实现方式就是分布取出单列,然后进行对结果进行合并,sql如下。

SELECT uin, 1 AS type, of_amt

FROM t_user_trans

UNION ALL

SELECT uin, 2 AS type, lf_amt

FROM t_user_trans

UNION ALL

SELECT uin, 3 AS type, on_amt

FROM t_user_trans

UNION ALL

SELECT uin, 4 AS type, cr_amt

FROM t_user_trans

方法二,使用posexplode

explode是内建函数, 支持两种用法分别是:

explode(ARRAY) 列表中的每个元素生成一行。

explode(MAP) map中每个key-value对,生成一行,key为一列,value为一列。

使用explode(ARRAY)没有type列,因此无法将转换后的行对应到之前的列,这里可以使用posexplode来代替,posexplode(ARRAY)转换后,可以获得列名在数组中的位置,这样将位置对应一列进行输出即可。

SELECT

uin

t.pos+1 AS type,

t.value AS amount

FROM t_user_tans

LATERAL VIEW

posexplode(

ARRAY(

of_amt,

lf_amt,

on_amt,

cr_amt

)) t as pos, value

4.计算连续天数

有一张用户登陆流水表,需要计算用户的连续登陆天数,这里可以使用分组编号,Group By uin+时间减分组编号,这样连续的天数就被聚合在一起了,可以通过聚合函数计算最终结果。

SELECT

uin,

COUNT(uin) AS continuity_days

FROM(

SELECT

uin,

statis_day,

row_number() OVER(PARTITION BY uin order by statis_day asc) AS rn

FROM

(

SELECT

uin,

statis_day

FROM t_user_login_log

WHERE statis_day>= 20170101

AND statis_day <= 20180809

)

)

GROUP BY uin, date_sub(statis_day,CAST(rn AS INT))

5.分组排序取topN

如有t_user_score记录了学生所有的科目成绩,需要取出每个学生分数最高的一门学科。这里主要用到row_number()函数。

SELECT

uin

FROM

(

SELECT

uin,

course,

row_number() OVER(PARTITION BY uin order by score asc) AS rn

FROM

t_user_score

)

WHERE rn = 1

hive表 合并字段_hive sql常用技巧相关推荐

  1. hive表 合并字段_hive 两字段合并成 一个字段 例如:字段a和字段b合并成a-b,请问如何实现、...

    展开全部 使用函数concat select concat(a,'-',b) from就可以实现了. hive是基于Hadoop的一个数据3231313335323631343130323136353 ...

  2. 查找数据库指定数据的数据表和字段名称SQL语句

     查找数据库指定数据的数据表和字段名称SQL语句 五百年前,因怀璧其罪,她被天下追杀,还连累了唯一的亲人. http://weibo.com/p/23047910076763  在灵魂消散的那一刻 ...

  3. hive表新增字段和字段注释修改

    hive表新增字段,修改字段的注释 (1)创建测试表: use mart_flow_test; create table if not exists mart_flow_test.detail_flo ...

  4. 达梦数据库查看某个表的字段类型、常用数据库驱动类名以及URL

    达梦数据库查看某个表的字段类型 select * from all_tab_columns where Table_Name='T_FILES' AND OWNER='WJW'; 注:Table_Na ...

  5. hive表列字段显示

    要在hive表中显示列名,我们可以在hive命令行中开启 hive> set hive.cli.print.header=true; 但显示的列字段会带表名,列名会很冗长,所以要去除掉表名,单独 ...

  6. hivesql修改字段类型_Hive SQL常用命令总结,大数据开发人员按需收藏

    Hive是基于Hadoop生态的一个重要组件,是对数据仓库进行管理和分析数据的工具.她提供了SQL查询方式来分析存储在HDFS分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完 ...

  7. 表 合并字段_多工作表动态合并,其实很简单

    小伙伴们好啊,今天老祝和大家分享一个动态合并多个工作表的技巧. 很多时候,咱们的数据是按照部门或是月份等项目,分别存放在不同工作表中的,要对这些数据进行分析汇总的时候,需要先将不同工作表中的数据合并到 ...

  8. 数据库mysql表常见字段大小_常用的数据库的字段类型及大小

    Oracle/MSSQL/Mysql 常用数据库的字段类型及大小 ORACLE的数据类型 常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 ...

  9. 数据库基本概念 - 表、字段、sql语句

    这里使用一个简易的access数据库操作工具:access数据库的后缀名为.mdb: 输入如下图的语句,执行,将创建一张表:名为Tab1: 在数据库里执行的代码一般称为SQL语句:表,在纵向的方面,是 ...

  10. hive 表存储大小_Hive中文件存储格式及大小比较测试

    在hive中创建表是有如下一个语句 [ROW FORMAT row_format] row_format 的类型有如下: file_format: : SEQUENCEFILE | TEXTFILE ...

最新文章

  1. python 路径往上一层_Python常用模块之模块、包介绍和相关语法
  2. iis mysql php 附件上传大小_修改上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法...
  3. idea无法找到主启动类_idea 启动springboot项目报找不到主类
  4. hashcode、equals
  5. 从功能、交互、性能全方位解读,BI工具FineBI4.0.2测评报告
  6. opengl绘制刻度坐标系_OpenGL中的坐标系-2D
  7. npm 报错 : npm ERR! Maximum call stack size exceeded
  8. java语言开发的中间件名称,值得收藏!
  9. 推荐: 一个业务流程梳理工具Sam
  10. html入门的常见问题
  11. 使用迅捷PDF编辑器免费去除pdf水印
  12. PHP实现电子商务网站
  13. server2008服务器进不了桌面,解决windows server 2008 r2 登录进入桌面只显示一片蓝色背景...
  14. 捷联惯导知识点之非直角坐标系到直角坐标系
  15. 系统架构设计师与系统分析师历年实体分析与解答下载_做Python数据分析5年了,复制粘贴是我最牛逼的技能,直到看到这些公众号,我学习了...
  16. Cesium — orientation计算
  17. C语言排列组合(函数
  18. seq to seq
  19. JavaScript的原型和继承
  20. 大前端CPU优化技术--NEON指令介绍

热门文章

  1. 微信第三方平台服务器,微信三方平台接入
  2. 一篇文章带你了解系统流程图和业务流程图的区别
  3. 计算机桌面广告弹窗,电脑乱弹广告怎么办_怎么禁止桌面弹出广告
  4. 出口托收结算方式DA、DP、CAD详解
  5. EditPlus安装步骤
  6. c语言课程设计日程表,日程表:schedule用法大全
  7. 如何在R里面安装做gif动图的gganimate包
  8. 芯力特SIT1043Q完全替代恩智浦TJA1043
  9. 博客营销成功案例分析
  10. 【8001】解决打开idea出现红色感叹号报错信息Cannot find keymap Windows copy?