Impala
https://impala.apache.org/docs/build/
https://impala.apache.org/docs/build/topics/
https://impala.apache.org/docs/build/html/topics/
Impala 内置函数: https://impala.apache.org/docs/build/html/topics/impala_functions.html
数学函数
https://impala.apache.org/docs/build/html/topics/impala_math_functions.html#math_functions
- ABS
- ACOS
- ASIN
- ATAN
- ATAN2
- BIN
- CEIL, CEILING, DCEIL
- CONV(BIGINT n, INT from_base, INT to_base), CONV(STRING s, INT from_base, INT to_base):进制转换函数。将16进制的A转换为2进制
select conv('A',16,2) as conv;将16进制的5转换为2进制select conv(5,16,2) as conv; - COS
- COSH
- COT
- DEGREES
- E
- EXP
- FACTORIAL
- FLOOR, DFLOOR
- FMOD
- FNV_HASH
- GREATEST
- HEX
- IS_INF
- IS_NAN
- LEAST
- LN
- LOG
- LOG10
- LOG2
- MAX_INT, MAX_TINYINT, MAX_SMALLINT, MAX_BIGINT
- MIN_INT, MIN_TINYINT, MIN_SMALLINT, MIN_BIGINT
- MOD
- MURMUR_HASH
- NEGATIVE
- PI
- PMOD
- POSITIVE
- POW, POWER, DPOW, FPOW
- PRECISION
- QUOTIENT
- RADIANS
- RAND, RANDOM
- ROUND, DROUND
- SCALE
- SIGN
- SIN
- SINH
- SQRT
- TAN
- TANH
- TRUNCATE, DTRUNC, TRUNC
- UNHEX
- WIDTH_BUCKET
类型转换函数
cast(year(“2017-06-15”) as decimal(8,0)) as date_year,
cast(‘100’ as int), – 100
typeof(‘100’), – STRING 查看字段类型
数据类型
https://impala.apache.org/docs/build/html/topics/impala_datatypes.html
日期和时间函数
https://impala.apache.org/docs/build/html/topics/impala_datetime_functions.html#datetime_functions
1 | select trunc('2022-04-09', 'y'); -- 当年第一天 |
查询某一天是当年的第几周,年第一天非周一的日期归属到去年最后一周
| 输入 data_dt | 输出 dt_week |
|---|---|
| 20210103 | 2020W53 |
| 20201231 | 2020W53 |
| 20190104 | 2019W1 |
1 | SELECT |
条件函数
- CASE
- CASE2
- COALESCE(type v1, type v2, …) :返回第一个不为 NULL 的参数,如果都为 NULL 则返回 NULL。
- DECODE(type expression, type search1, type result1 [, type search2, type result2 …] [, type default_result] ) 同 Oracle 的 decode() 函数。
- IF
- IFNULL
- ISFALSE
- ISNOTFALSE
- ISNOTTRUE
- ISNULL
- ISTRUE
- NONNULLVALUE
- NULLIF
- NULLIFZERO
- NULLVALUE
- NVL
- NVL2
- ZEROIFNULL
字符串函数
https://impala.apache.org/docs/build/html/topics/impala_string_functions.html#string_functions
CONCAT(STRING a, STRING b…):返回一个字符串,表示连接在一起的所有参数值。如果有任何参数
NULL,则返回NULL。CONCAT_WS(STRING sep, STRING a, STRING b…):返回一个字符串,表示连接在一起的第二个和后面的参数值,由指定的分隔符分隔。
concat()和concat_ws()适用于连接同一行中多列的值,同时group_concat()将来自不同行的值连接在一起。GROUP_CONCAT(STRING s [, STRING sep]) :字符串分组合并函数。返回一个字符串,表示为结果集的每一行连接在一起的参数值。如果指定了可选的分隔符字符串,则在每对连接值之间添加分隔符。
group_concat(distinct city_name, '-')REGEXP_ESCAPE(STRING source) :该函数返回RE2库中特殊字符的转义字符串,以便特殊字符被按字面解释,而不是被解释为特殊字符。以下特殊字符由函数转义:
.\+*?[^]$(){}=!<>|:-。regexp_escape('Hello.world')结果为Hello\.world。REGEXP_EXTRACT(STRING subject, STRING pattern, INT index) :根据正则表达式模式从字符串中返回指定的 () 组。第 0 组是指整个提取的字符串,而第 1、2 等组是指第一个、第二个等
(...)部分。REGEXP_LIKE(STRING source, STRING pattern[, STRING options]) :返回
true或false指示源字符串中的任何位置是否包含由模式给出的正则表达式。可选的第三个参数由字母标志组成,这些标志改变了匹配的执行方式,例如i不区分大小写的匹配。可选的第三个参数:
c:区分大小写的匹配(默认)。i:不区分大小写的匹配。如果第三个参数中包括c和i的多个实例,则最后一个此类选项优先。m: 多行匹配。^和$运算符匹配源字符串中任何行的开始或结束,而不是整个字符串的开始和结束。n: 换行匹配。.运算符可以匹配换行符。重复运算符如.*可以匹配跨越多行的源字符串的一部分。
REGEXP_REPLACE(STRING initial, STRING pattern, STRING replacement) :返回初始参数,正则表达式模式被最终参数字符串替换。
SPLIT_PART(STRING source, STRING delimiter, BIGINT index) :返回由 delimiter 分割的 source 字符串的 indexth 部分。
聚合函数
https://impala.apache.org/docs/build/html/topics/impala_aggregate_functions.html#aggregate_functions
分析函数
https://impala.apache.org/docs/build/html/topics/impala_analytic_functions.html#analytic_functions
AVG
COUNT
CUME_DIST:返回值的累积分布。结果集中每一行的值都大于 0 且小于或等于 1。
DENSE_RANK:递增不跳跃并列的序列号1,1,2
FIRST_VALUE:分组的第一个数据
LAG:分组的后几个数据。Lagging 落后于
LAST_VALUE:分组的最后一个数据
LEAD:分组的前几个数据。Leading 领先于
MAX
MIN
NTH_VALUE:返回相对于窗口的第一行的窗口框架的指定行的表达式值。
NTILE:将分区中已排序的行划分为大小尽可能相等的指定数量的已排名组,并返回给定行所在的组。
PERCENT_RANK:百分比排名函数。计算公式:(rank - 1) / (rows - 1)
RANK:递增跳跃的序列号1,1,3
ROW_NUMBER:依次递增的序列号1,2,3
SUM
简单分类
序号函数:row_number() / rank() / dense_rank()
分布函数:percent_rank() / cume_dist()
前后函数:lag() / lead()
头尾函数:first_val() / last_val()
其他函数:nth_value() / ntile()
OVER 子句
analytic functions:分析函数
aggregate functions:聚合函数
调用纯分析函数(例如:LEAD() 、RANK() 、FIRST_VALUE())必须使用 OVER 子句。
当调用的聚合函数包含 OVER 子句时(例如:MAX()、COUNT() 、SUM()),它们将作为分析函数运行。
语法:
1 | function(args) OVER([partition_by_clause] [order_by_clause [window_clause]]) |
限制
不能直接将 DISTINCT 运算符与分析函数调用结合起来。可以将分析函数调用放在 WITH 子句或内联视图中,并将 DISTINCT运算符应用于其结果集。
1 | WITH tt ( |
window 子句
窗口子句仅允许与 ORDER BY 子句组合使用。
如果指定了ORDER BY子句,但没有指定 window 子句,默认窗口是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。
某些分析函数接受可选的 window 子句,该子句使函数仅分析当前行“周围”的某些行,而不是分区中的所有行。例如,您可以通过指定一定数量的前行和后行来获得移动平均数,或者通过指定截至当前位置的所有行来获得运行计数或运行总计。该子句可能导致同一分区内的行的分析结果不同。
支持窗口子句的函数:AVG() 、COUNT() 、FIRST_VALUE() 、LAST_VALUE() 、SUM() 。
对于 MAX() 和 MIN(),仅当开始边界为 UNBOUNDED PRECEDING 时才允许使用 window 子句。
语法:
1 | ROWS BETWEEN [ { m | UNBOUNDED } PRECEDING | CURRENT ROW] [ AND [CURRENT ROW | { UNBOUNDED | n } FOLLOWING] ] |
ROWS BETWEEN 根据结果集中行的索引定义窗口的大小。窗口的大小是根据结果集中的位置子句预测的。
RANGE BETWEEN 当前不支持使用数字参数来定义可变大小的滑动窗口。
目前,Impala 仅支持 RANGE 子句的一些参数组合:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(当指定了ORDER BY并且省略了 window子句 时的默认值)RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWINGRANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
使用时 RANGE,CURRENT ROW不仅包括当前行,还包括基于 ORDER BY 表达式与当前行关联的所有行。
窗口函数参考
https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/c_SQL_functions.html
位函数
https://impala.apache.org/docs/build/html/topics/impala_bit_functions.html#bit_functions
杂项功能
https://impala.apache.org/docs/build/html/topics/impala_misc_functions.html#misc_functions
Impala 支持以下不对特定列或数据类型进行操作的实用程序函数:
1 | CURRENT_DATABASE |
关联查询语句
https://impala.apache.org/docs/build/html/topics/impala_joins.html
full outer join 不超过万速度还可以
cross join 不超过万速度还可以,又称为笛卡尔乘积,实际上是把两个表乘起来,理论上不应该支持on语法
natural join 自然连接不支持
连接查询的性能注意事项
https://impala.apache.org/docs/build/html/topics/impala_perf_joins.html
EXPLAIN语句
https://impala.apache.org/docs/build/html/topics/impala_explain.html
ApacheImpala优化建议子集
1、尽量使用数字类型
2、选择字段的字段只选择需要的字段
3、left join时左边放大表表右边放小表,right join时右大左小
4、Join 字段最好使用整数类型。
行转列
1 | SELECT |
多行聚合一行
1 | SELECT |
一行切割为多行
1 | -- 数据表条数必须大于等于字段分割后的最大项数 |
不同排序维度数据提取
1 | SELECT |
经纬度计算距离
1 | SELECT |
线性回归/线性拟合
| 处理前数据 | month | xx | yy | 预期输出 | month | xx | yy |
|---|---|---|---|---|---|---|---|
| 2019-09 | 2723822.6 | 1.44 | 2019-09 | 2723822.6 | 1.44 | ||
| 2019-10 | 2740666.4 | 1.47 | 2019-10 | 2740666.4 | 1.47 | ||
| 2019-11 | 2847629.4 | 1.49 | 2019-11 | 2847629.4 | 1.49 | ||
| 2020-01 | 2830692.2 | 1.51 | 2020-01 | 2830692.2 | 1.51 | ||
| 2020-02 | 2751622.5 | 1.53 | 2020-02 | 2751622.5 | 1.53 | ||
| 2020-03 | 2828788.1 | 1.54 | 2020-03 | 2828788.1 | 1.54 | ||
| 2020-04 | 3009157.4 | 1.58 | 2020-04 | 3009157.4 | 1.58 | ||
| 2020-05 | 2870360.3 | 1.62 | 2020-05 | 2870360.3 | 1.62 | ||
| 2020-06 | 2958902.3 | 1.66 | 2020-06 | 2958902.3 | 1.66 | ||
| 2020-07 | 3023999.5 | 2020-07 | 3023999.5 | 1.64 | |||
| 2020-08 | 3136022.3 | 2020-08 | 3136022.3 | 1.70 | |||
| 2020-09 | 3265788.6 | 2020-09 | 3265788.6 | 1.78 | |||
| 2020-10 | 3348522.8 | 2020-10 | 3348522.8 | 1.82 | |||
| 2020-11 | 3439811.7 | 2020-11 | 3439811.7 | 1.87 | |||
| 2020-12 | 3532455.9 | 2020-12 | 3532455.9 | 1.93 |
1 | DROP TABLE IF EXISTS base_table; |
待熟练函数
获取数值的对应的百分位数值percentile