SORT_ARRAY

函数声明如下。

ARRAY sort_array(ARRAY<T>)

用途:对给定数组中的数据排序。

参数说明:ARRAY,ARRAY类型的数据。数组中的数据可为任意类型。

返回值:ARRAY类型。

示例如下。

--建表
CREATE TABLE sort_array
(c1 ARRAY<STRING>,c2 ARRAY<INT>
)
;--装载数据
INSERT OVERWRITE TABLE sort_array
SELECT  array('d','c','b','a')  AS c1,array(4,3,2,1)         AS c2
;--查询
SELECT  sort_array(c1),sort_array(c2)
FROM    sort_array
;--结果["a","b","c","d"] [1,2,3,4]

分析函数

基本语法

analytic_function_name([argument_list])
OVER (
[PARTITION BY partition_expression,…]
[ORDER BY sort_expression, … [ASC|DESC]])
  • analytic_function_name: 函数名称 — 比如 RANK(), SUM(), FIRST()等等

  • partition_expression: 分区列

  • sort_expression: 排序列

案例

数据准备

CREATE TABLE `orders_new` (`order_num` String COMMENT '订单号',`order_amount` DECIMAL ( 12, 2 ) COMMENT '订单金额',`advance_amount` DECIMAL ( 12, 2 ) COMMENT '预付款',`order_date` string COMMENT '订单日期',`cust_code` string COMMENT '客户',`agent_code` string COMMENT '代理商'
);
INSERT INTO orders VALUES('200100', '1000.00', '600.00', '2020-08-01', 'C00013', 'A003');
INSERT INTO orders VALUES('200110', '3000.00', '500.00', '2020-04-15', 'C00019', 'A010');
INSERT INTO orders VALUES('200107', '4500.00', '900.00', '2020-08-30', 'C00007', 'A010');
INSERT INTO orders VALUES('200112', '2000.00', '400.00', '2020-05-30', 'C00016', 'A007');
INSERT INTO orders VALUES('200113', '4000.00', '600.00', '2020-06-10', 'C00022', 'A002');
INSERT INTO orders VALUES('200102', '2000.00', '300.00', '2020-05-25', 'C00012', 'A012');
INSERT INTO orders VALUES('200114', '3500.00', '2000.00', '2020-08-15', 'C00002','A008');
INSERT INTO orders VALUES('200122', '2500.00', '400.00', '2020-09-16', 'C00003', 'A004');
INSERT INTO orders VALUES('200118', '500.00', '100.00', '2020-07-20', 'C00023', 'A006');
INSERT INTO orders VALUES('200119', '4000.00', '700.00', '2020-09-16', 'C00007', 'A010');
INSERT INTO orders VALUES('200121', '1500.00', '600.00', '2020-09-23', 'C00008', 'A004');
INSERT INTO orders VALUES('200130', '2500.00', '400.00', '2020-07-30', 'C00025', 'A011');
INSERT INTO orders VALUES('200134', '4200.00', '1800.00', '2020-09-25', 'C00004','A005');
INSERT INTO orders VALUES('200108', '4000.00', '600.00', '2020-02-15', 'C00008', 'A004');
INSERT INTO orders VALUES('200103', '1500.00', '700.00', '2020-05-15', 'C00021', 'A005');
INSERT INTO orders VALUES('200105', '2500.00', '500.00', '2020-07-18', 'C00025', 'A011');
INSERT INTO orders VALUES('200109', '3500.00', '800.00', '2020-07-30', 'C00011', 'A010');
INSERT INTO orders VALUES('200101', '3000.00', '1000.00', '2020-07-15', 'C00001','A008');
INSERT INTO orders VALUES('200111', '1000.00', '300.00', '2020-07-10', 'C00020', 'A008');
INSERT INTO orders VALUES('200104', '1500.00', '500.00', '2020-03-13', 'C00006', 'A004');
INSERT INTO orders VALUES('200106', '2500.00', '700.00', '2020-04-20', 'C00005', 'A002');
INSERT INTO orders VALUES('200125', '2000.00', '600.00', '2020-10-01', 'C00018', 'A005');
INSERT INTO orders VALUES('200117', '800.00', '200.00', '2020-10-20', 'C00014', 'A001');
INSERT INTO orders VALUES('200123', '500.00', '100.00', '2020-09-16', 'C00022', 'A002');
INSERT INTO orders VALUES('200120', '500.00', '100.00', '2020-07-20', 'C00009', 'A002');
INSERT INTO orders VALUES('200116', '500.00', '100.00', '2020-07-13', 'C00010', 'A009');
INSERT INTO orders VALUES('200124', '500.00', '100.00', '2020-06-20', 'C00017', 'A007');
INSERT INTO orders VALUES('200126', '500.00', '100.00', '2020-06-24', 'C00022', 'A002');
INSERT INTO orders VALUES('200129', '2500.00', '500.00', '2020-07-20', 'C00024', 'A006');
INSERT INTO orders VALUES('200127', '2500.00', '400.00', '2020-07-20', 'C00015', 'A003');
INSERT INTO orders VALUES('200128', '3500.00', '1500.00', '2020-07-20', 'C00009','A002');
INSERT INTO orders VALUES('200135', '2000.00', '800.00', '2020-09-16', 'C00007', 'A010');
INSERT INTO orders VALUES('200131', '900.00', '150.00', '2020-08-26', 'C00012', 'A012');
INSERT INTO orders VALUES('200133', '1200.00', '400.00', '2020-06-29', 'C00009', 'A002');

排序累加

SELECTagent_code,order_date,order_amount,SUM( order_amount ) OVER ( PARTITION BY agent_code ORDER BY order_date desc rows BETWEEN unbounded preceding AND current row  ) total_rev
FROM
orders_new
WHERE
order_date >= '2020-07-01'
AND order_date <= '2020-09-30';
  • 结果

A002 2020-09-16 500.00 500.00
A002 2020-07-20 3500.00 4000.00
A002 2020-07-20 500.00 4500.00
A003 2020-08-01 1000.00 1000.00
A003 2020-07-20 2500.00 3500.00
A004 2020-09-23 1500.00 1500.00
A004 2020-09-16 2500.00 4000.00
A005 2020-09-25 4200.00 4200.00
A006 2020-07-20 2500.00 2500.00
A006 2020-07-20 500.00 3000.00
A008 2020-08-15 3500.00 3500.00
A008 2020-07-15 3000.00 6500.00
A008 2020-07-10 1000.00 7500.00
A009 2020-07-13 500.00 500.00
A010 2020-09-16 2000.00 2000.00
A010 2020-09-16 4000.00 6000.00
A010 2020-08-30 4500.00 10500.00
A010 2020-07-30 3500.00 14000.00
A011 2020-07-30 2500.00 2500.00
A011 2020-07-18 2500.00 5000.00
A012 2020-08-26 900.00 900.00

AVG() 和SUM()

需求描述:

第三季度每个代理商的移动平均收入和总收入

SELECTagent_code,order_date,AVG( order_amount ) OVER ( PARTITION BY agent_code ORDER BY order_date)  avg_rev,SUM( order_amount ) OVER ( PARTITION BY agent_code ORDER BY order_date ) total_rev
FROM
orders
WHERE
order_date >= '2020-07-01'
AND order_date <= '2020-09-30';

结果输出

A002    2020-07-20      2000    4000
A002    2020-07-20      2000    4000
A002    2020-09-16      1500    4500
A003    2020-07-20      2500    2500
A003    2020-08-01      1750    3500
A004    2020-09-16      2500    2500
A004    2020-09-23      2000    4000
A005    2020-09-25      4200    4200
A006    2020-07-20      1500    3000
A006    2020-07-20      1500    3000
A008    2020-07-10      1000    1000
A008    2020-07-15      2000    4000
A008    2020-08-15      2500    7500
A009    2020-07-13      500     500
A010    2020-07-30      3500    3500
A010    2020-08-30      4000    8000
A010    2020-09-16      3500    14000
A010    2020-09-16      3500    14000
A011    2020-07-18      2500    2500
A011    2020-07-30      2500    5000
A012    2020-08-26      900     900

FIRST_VALUE()和 LAST_VALUE()

  • first_value: 取分组内排序后,截止到当前行,第一个值

  • last_value: 取分组内排序后,截止到当前行,最后一个值

需求描述

客户首次购买后多少天才进行下一次购买

SELECTcust_code,order_date,datediff(order_date,FIRST_VALUE ( order_date ) OVER ( PARTITION BY cust_code ORDER BY order_date )) next_order_gap
FROM
orders
order by cust_code,next_order_gap

结果输出

C00001  2020-07-15      0
C00002  2020-08-15      0
C00003  2020-09-16      0
C00004  2020-09-25      0
C00005  2020-04-20      0
C00006  2020-03-13      0
C00007  2020-08-30      0
C00007  2020-09-16      17
C00007  2020-09-16      17
C00008  2020-02-15      0
C00008  2020-09-23      221
C00009  2020-06-29      0
C00009  2020-07-20      21
C00009  2020-07-20      21
C00010  2020-07-13      0
C00011  2020-07-30      0
C00012  2020-05-25      0
C00012  2020-08-26      93
C00013  2020-08-01      0
C00014  2020-10-20      0
C00015  2020-07-20      0
C00016  2020-05-30      0
C00017  2020-06-20      0
C00018  2020-10-01      0
C00019  2020-04-15      0
C00020  2020-07-10      0
C00021  2020-05-15      0
C00022  2020-06-10      0
C00022  2020-06-24      14
C00022  2020-09-16      98
C00023  2020-07-20      0
C00024  2020-07-20      0
C00025  2020-07-18      0
C00025  2020-07-30      12

LEAD() 和 LAG()

  • lead(value_expr[,offset[,default]]):用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL

  • lag(value_expr[,offset[,default]]): 与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

需求描述

代理商最近一次出售的最高订单金额是多少?

SELECTagent_code,order_amount,LAG ( order_amount, 1 ) OVER ( PARTITION BY agent_code ORDER BY order_amount DESC ) last_highest_amount
FROMorders
ORDER BYagent_code,order_amount DESC;

结果输出

A001    800     NULL
A002    4000    NULL
A002    3500    4000
A002    2500    3500
A002    1200    2500
A002    500     1200
A002    500     500
A002    500     500
A003    2500    NULL
A003    1000    2500
A004    4000    NULL
A004    2500    4000
A004    1500    2500
A004    1500    1500
A005    4200    NULL
A005    2000    4200
A005    1500    2000
A006    2500    NULL
A006    500     2500
A007    2000    NULL
A007    500     2000
A008    3500    NULL
A008    3000    3500
A008    1000    3000
A009    500     NULL
A010    4500    NULL
A010    4000    4500
A010    3500    4000
A010    3000    3500
A010    2000    3000
A011    2500    NULL
A011    2500    2500
A012    2000    NULL
A012    900     2000

RANK() 和DENSE_RANK()

**rank:**对组中的数据进行排名,如果名次相同,则排名也相同,但是下一个名次的排名序号会出现不连续。比如查找具体条件的topN行。RANK() 排序为 (1,2,2,4)

**dense_rank:**dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。当出现名次相同时,则排名序号也相同。而下一个排名的序号与上一个排名序号是连续的。

DENSE_RANK() 排序为 (1,2,2,3)

需求描述

每月第二高的订单金额是多少?

SELECTorder_num,order_date,order_amount,order_month
FROM(
SELECTorder_num,order_date,order_amount,DATE_FORMAT( order_date, 'YYYY-MM' ) AS order_month,DENSE_RANK ( ) OVER ( PARTITION BY DATE_FORMAT( order_date, 'YYYY-MM' ) ORDER BY order_amount DESC ) order_rank
FROMorders ) t
WHEREorder_rank = 2
ORDER BYorder_date;

结果输出

200106  2020-04-20      2500    2020-04
200103  2020-05-15      1500    2020-05
200133  2020-06-29      1200    2020-06
200101  2020-07-15      3000    2020-07
200114  2020-08-15      3500    2020-08
200119  2020-09-16      4000    2020-09
200117  2020-10-20      800     2020-10

REGEXP_EXTRACT

  • 命令格式

    string regexp_extract(string <source>, string <pattern>[, bigint <occurrence>])
  • 命令说明

    将字符串source按照pattern的规则拆分为组,返回第occurrence个组的字符串。

  • 参数说明

    • source:必填。STRING类型,待拆分的字符串。

    • pattern:必填。STRING类型常量或正则表达式。待匹配的模型。

    • occurrence:可选。BIGINT类型常量,必须大于等于0。

  • 返回值说明

    返回STRING类型。返回规则如下:

    • 如果pattern为空串或pattern中没有分组,返回报错。

    • occurrence非BIGINT类型或小于0时,返回报错。不指定时默认为1,表示返回第一个组。如果occurrence等于0,则返回满足整个pattern的子串。

    • sourcepatternoccurrence值为NULL时,返回NULL。

  • 示例

    select regexp_extract('foothebar', '(foo)(.*?)(bar)', 0);     --返回foothebar
    select regexp_extract('foothebar', '(foo)(.*?)(bar)', 1);     --返回foo
    select regexp_extract('foothebar', '(foo)(.*?)(bar)', 2);     --返回the
    select regexp_extract('foothebar', '(foo)(.*?)(bar)', 3);     --返回bar

多行数据合并为一行数据

WM_CONCAT

  • 命令格式

    string wm_concat(string <separator>, string <colname>)
  • 命令说明

    用指定的separator做分隔符,连接colname中的值。

  • 参数说明

    • separator:必填。STRING类型常量,分隔符。

    • colname:必填。STRING类型。如果输入为BIGINT、DOUBLE或DATETIME类型,会隐式转换为STRING类型后参与运算。

  • 返回值说明

    返回STRING类型。返回规则如下:

    • separator非STRING类型常量时,返回报错。

    • colname非STRING、BIGINT、DOUBLE或DATETIME类型时,返回报错。

    • colname值为NULL时,该行不会参与计算。

  • 示例

--建表
CREATE TABLE stu
(class STRING,gender STRING,name STRING
)
;--装载数据
INSERT INTO TABLE stu SELECT  '1','M','lilei';
INSERT INTO TABLE stu SELECT  '1','F','hanmeimei';
INSERT INTO TABLE stu SELECT  '1','M','jim';
INSERT INTO TABLE stu SELECT  '1','M','hanmeimei';
INSERT INTO TABLE stu SELECT  '2','F','tom';
INSERT INTO TABLE stu SELECT  '2','M','peter';--查询
SELECT class, wm_concat(distinct ',', name) FROM stu GROUP BY class;

KEYVALUE

  • 命令格式

    keyvalue(string <str>,[string <split1>,string <split2>,] string <key>)
    keyvalue(string <str>,string <key>)
  • 命令说明

    将字符串str按照split1分成Key-Value对,并按split2将Key-Value对分开,返回key所对应的Value。

  • 参数说明

    即默认的分隔符是**;,KV之间的分割是:**

    • key:必填。STRING类型。将字符串按照split1split2拆分后,返回key值对应的Value。

    • str:必填。STRING类型。待拆分的字符串。

    • split1split2:可选。STRING类型。用于作为分隔符的字符串,按照指定的两个分隔符拆分源字符串。如果表达式中没有指定这两项,默认split1";"split2":"。当某个被split1拆分后的字符串中有多个split2时,返回结果未定义。

  • 返回值说明

    返回STRING类型。返回规则如下:

    • split1split2值为NULL时,返回NULL。

    • strkey值为NULL或没有匹配的key时,返回NULL。

    • 如果有多个Key-Value匹配,返回第一个匹配上的key对应的Value。

select keyvalue('0:1\;1:2', 1);  --返回2
select keyvalue('spm=123.qwe,cpn=101,act=890',',','=','spm')  ----返回123.qwe

优化相关

distribute by+sort by V.S order by

  • order by将结果按某字段全局排序,这会导致所有map端数据都进入一个reducer中,在数据量大时可能会长时间计算不完

  • distribute by用于控制map端数据分配到reducer的key,sort by会视情况启动多个reducer进行排序,并且保证每个reducer内局部有序

group by V.S count(distinct)

  • 当数据量级很大,用group by ,可以启动多个job

  • 数据集很小或者key的倾斜比较明显时,用count(distinct),少量的reduce就可以处理

map join

  • Hive会将build table和probe table在map端直接完成join过程,消灭了reduce,效率很高

  • set hive.auto.convent.join=true; /*+MAPJOIN(t1,t3,t4)*/

面试|HiveSQL常用的一些小技巧相关推荐

  1. JAVASCRIPT常用20种小技巧汇总

    1.TEXTAREA自适应文字行数的多少 2.脚本永不出错 <script LANGUAGE="javascript"> </script> 3.ENTER ...

  2. web开发常用js功能性小技巧(转)

    web开发常用js功能性小技巧 -------------------------------------------------------------------------------- < ...

  3. 常用电脑维护小技巧之二

    常用电脑维护小技巧之二 最近队里有好几台电脑因为硬件损坏无法使用,恨自己没有本事,不能修理此类问题,今天写这个文章主要是说说一些自己的理解,如何区分硬件问题,还是因系统和程序等软件引起的问题,软件问题 ...

  4. HiveSQL一天一个小技巧:如何精准计算非连续日期累计值【闪电快车面试题】

    0 需 求 稀疏字段累计求和问题 1 问题分析 根据图片中数据变换的形式,可以看出是根据字段term补齐数据中缺失的日期,term为连续日期的个数,当为12时,表明由2018-12-21到2019-0 ...

  5. 20个常用的Python小技巧

    2019 年第 73 篇文章,总第 97 篇文章 原题 | 20 Python Snippets You Should Learn Today 作者 | Chaitanya Baweja 原文 | h ...

  6. 【转】Qtcreator中常用快捷键和小技巧

    转自:https://blog.csdn.net/imxiangzi/article/details/48863855  https://blog.csdn.net/jh1513/article/de ...

  7. 图像处理保研面试_细思极妙的保研面试经验汇总?这些小技巧太加分了吧

    各大高校夏令营如火如荼进行中,但今年因为特殊原因,大部分高校采取了线上面试的方法,但不乏也有一大批学校仍采取传统的线下面试形式,鉴于这种情况,今天君君将分两部分说明,线上线下面试,我们可以拥有的加分小 ...

  8. cadence常用快捷键及小技巧(画斜线、开balloons等)

    快捷键 ESC 退出本次操作 1 点亮线网(一次) 3 消除点亮和连线 4 查看information,hierarchical scope 5 打印 Device information,本sche ...

  9. Excel中常用快捷键及小技巧

    写在前面 个人总结,仅供参考,不一定全面,不常用的不列举,以后遇到合适的会定期过来补充. 快捷键 Ctrl+C--复制 Ctrl+V--粘贴 Ctrl+Z--撤销 Ctrl+F--查找 Ctrl+G- ...

最新文章

  1. 未来计算机体系结构,华中科大金海:未来是计算机体系结构的“黄金十年” 要培养大量创新人才...
  2. 面试必备的 23 个JVM 面试真题!
  3. 基于用户投票的排名算法(五):威尔逊区间
  4. python read函数菜鸟_关于python的菜鸟问题
  5. linux之history和!命令联合使用
  6. linux找不到动态链接库 .so文件的解决方法
  7. python横向输出字符串_Python字符串及用法详解
  8. layui分页完整实例php,使用 layui 后端分页的实例
  9. 从计算机视觉到人脸识别:一文看懂颜色模型、信号与噪声
  10. MATLAB 中如何使用 help
  11. H2O机器学习:一种强大的可扩展的人工智能和深度学习技术
  12. 基于SLAM融合构图的自主轮式仓储货运机器人技术说明
  13. matlab 残差plot,residualplot分析
  14. 测试开发基础 | Python 算法与数据结构面试题系列一(附答案)
  15. 电脑之间如何迁移数据?数据迁移方法描述
  16. 情感分析动力学知识框架(晏殊几何学情锚讲义)
  17. java游戏熊猫修牧场的_教你玩转牧场积分,角色练满25修不是梦想
  18. 为何世人对C+语言存在误解?C语言和C+太难?没前途?谬论!
  19. 渗透测试之域名信息搜索器 Dig教程
  20. 2015湖南省赛 CSU 1783 :聊天止于呵呵(模拟)

热门文章

  1. 帆软报表列表_FineReport专业报表制作工具
  2. mybatisplus代码生成报错:Exception in thread “main“ java.lang.NoClassDefFoundError: org/apache/velocity
  3. ppt模板最后一页写什么?
  4. 【学习方法】如何快速地进行阅读?如何在阅读的时候快速理解其中的内容?
  5. java连接数据库实现图书管理器
  6. 回馈社会 初志企业文化践行月活动顺利开展
  7. 海上钢琴师——陆地对我而言不过是一个更大的船
  8. pip 查看和配置源
  9. 第一本人工智能教材入驻高中课堂,程序员们要加油了
  10. 使用Rufus工具安装Dell服务器系统操作步骤