工作小结(使用频率高)

数仓中的全量表,增量表

  • 全量表:每天的所有的最新状态的数据。(有无变化都要上报所有数据)
  • 增量表:新增数据。(记录每次增加的量,而不是总量)
    举个例子:
mysql数据 全量表 增量表 快照表
20221125 A B C A B C
20221126 A B C D E A B C D E A B C D E
20221127 A B C D E F A B C D E F A B C D E F
20221128 A B C D E F
全量表 增量表 快照表
数据 包含前一天的全量数据 前一天的增量数据 包含前一天的全量数据
分区 不分区(ymd为当前日期) 按照每一天分区 按照每天分区

presto常用函数

条件表达式
  • case expression when value then result end
  • case when condition then true_value [else false_value] end
  • if(condition ,true_value,false_value) coalesce(value[,…])
  • nullif(value1,value2)
select nullif(1,2)   -- result: 1
select nullif(null,2)  -- result :null
select nullif(' ',null) --result :空
转换函数
字符串 转 时间戳(cast,date_parse)

cast(value AS type)

select cast('2022-03-17' as timestamp);
-- 2022-03-17 00:00:00.0
select cast('2022-03-17 00:00:00' as timestamp);
-- 2022-03-17 00:00:00.0
select date_parse('2022-03-17', '%Y-%m-%d');
-- 2022-03-17 00:00:00.0
select date_parse('2022-03-17 00:00:00', '%Y-%m-%d %H:%i:%S');
-- 2022-03-17 00:00:00.0
时间戳 格式化(format_datetime)
select format_datetime(cast('2022-03-17' as timestamp),'yyyy-MM-dd HH:mm:ss');
-- 2022-03-17 00:00:00
select format_datetime(cast('2022-03-17' as timestamp),'yyyy-MM-dd HH');
-- 2022-03-17 00
select date_trunc('second', current_timestamp());
-- 2022-05-03 13:37:12.0
时间间隔 date_diff(unit,timestamp1,timestam2)
select date_diff('day',cast('2022-03-17' as TIMESTAMP),cast('2022-03-26' as TIMESTAMP));
-- 9
select date_diff('month',cast('2022-02-17' as TIMESTAMP),cast('2022-03-26' as TIMESTAMP));
-- 1
select date_diff('year',cast('2021-02-17' as TIMESTAMP),cast('2022-03-26' as TIMESTAMP));
-- 1
数据格式

parse_presto_data_size(string) -> decimal(38)

SELECT parse_presto_data_size('1B'); -- 1
SELECT parse_presto_data_size('1kB'); -- 1024
SELECT parse_presto_data_size('1MB'); -- 1048576
SELECT parse_presto_data_size('2.3MB'); -- 2411724
数学函数

rand() 随机数
random() double
round(x,d) 保留小数

字符串函数
SELECT  'he'||'llo'  -- hello
SELECT chr(100) --d
concat(string1, string2)varchar
length(string)bigint   返回字符串的长度
lower(string)varchar   转换为小写
ltrim(string)varchar   去掉字符串开头的空格
trim(string)varchar    去掉字符串首尾的空格
replace(string, ‘a’)varchar   去掉字符串中的a字符
replace(string, ‘a’, ‘b’)varchar  把字符串中所有的a字符  替换 为 b
reverse(string)varchar   字符串倒序
rtrim(string)varchar  去掉字符串尾部的空格
split_part(string, delimiter, index)varchar 取出制定索引的元素。index1开始,如果Index超过了数组长度,则返回null。
strpos(string, substring)bigint  返回字符串中第一次出现substring的位置。从1开始,如果未找到,返回0select strpos('hello world!','l')  --3
select strpos('hello world!','da')  --0
substr(string, start, length)varcharstart位置 开始 截取字符串,截取的长度为length。
Select substr(2019-03-10 10:00:00,1,10)  --截取到日 2019-03-10
Select substr(2019-03-10 10:00:00,1,7)  --截取到月 2019-03
正则表达式

regexp_extract_all(string, pattern) -> array(varchar)
regexp_extract_all(string, pattern, group) -> array(varchar)

regexp_extract(string, pattern) → varchar
regexp_extract(string, pattern, group) → varchar

regexp_like(string, pattern) → boolean

regexp_replace(string, pattern) → varchar
regexp_replace(string, pattern, replacement) → varchar
regexp_replace(string, pattern, function) → varchar

regexp_split(string, pattern) -> array(varchar)

JSON 函数
  • is_json_scalar(json) → boolean 判断json是否为纯量
  • json_array_contains(json, value) → boolean 判断json中是否包含某个值 value
  • json_array_get(json_array, index) → json 返回指定索引位置的json元素,索引从0开始。
  • json_array_length(json) → bigint 返回json的长度
  • json_extract(json, json_path) → json 按照json_path格式 抓取json中的信息
  • json_extract_scalar(json, json_path) → varchar 和json_extract功能相同,返回值是varchar
  • json_format(json) → varchar 把json值转为序列化的json文本
  • json_parse(string) → json 和json_format(json)功能相反,将json格式的字符串转换为json。
SELECT json_array_get('["a", [3, 9], "c"]', 0); -- JSON 'a' (invalid JSON)
SELECT json_array_get('["a", [3, 9], "c"]', 1); -- JSON '[3,9]'
-- 索引页支持负数,表示从最后开始,-1表示最后一个元素。例:
SELECT json_array_get('["c", [3, 9], "a"]', -1); -- JSON 'a' (invalid JSON)
SELECT json_array_get('["c", [3, 9], "a"]', -2); -- JSON '[3,9]'
时间 函数
select date '2012-08-08' + interval '2' day --2012-08-10
select time '01:00' + interval '3' hour -- 04:00:00
select timestamp '2012-08-08 01:00' + interval '29' hour --2012-08-09 06:00:00.0
select timestamp '2012-10-31 01:00' + interval '1' month -- 2012-11-30 01:00:00.0
select interval '2' day + interval '3' hour -- {milliSeconds=183600000}
select interval '3' year + interval '5' month -- {months=41}
select date '2012-08-08' - interval '2' day -- 2012-08-06
select time '01:00' - interval '3' hour -- 22:00:00
select timestamp '2012-08-08 01:00' - interval '29' hour


select current_date  -- 2022-11-27
select current_time  -- 12:30:29
select current_timestamp --2022-11-27 12:30:46.341

-- date_add(unit, value, timestamp) → [same as input]
-- date_diff(unit, timestamp1, timestamp2) → bigint
-- date_format(timestamp, format) → varchar
-- date_parse(string, format) → timestamp
select year(timestamp '2022-11-27 12:30:46.341'); -- 2022
select quarter(timestamp '2022-11-27 12:30:46.341'); -- 3
select month(timestamp '2022-11-27 12:30:46.341'); -- 11
select week(timestamp '2022-11-27 12:30:46.341'); -- 47
select day(timestamp '2022-11-27 12:30:46.341'); --
聚合函数
  • count(*) → bigint 返回行数

  • count(x) → bigint 返回非 null 元素的个数

  • count_if(x) → bigint 返回 x 中元素为True 的个数,等同于count(CASE WHEN x THEN 1 END).

  • max_by(x, y) → [same as x] 返回与 y 的最大值相关的 x 值

  • max_by(x, y, n) → array<[same as x]> 返回与 y 的前 n 个最大值相关的 x 值的数组。替代一些使用row_number后再取前五的操作

  • min_by(x, y) → [same as x] 返回与 y 的最小值相关的 x 值

  • min_by(x, y, n) → array<[same as x]> 返回与 y 的前 n 个最小值相关的 x 值的数组

  • max(x) → [same as input] 返回最大值

  • max(x, n) → array<[same as x]> 返回前 n 个最大值列表

  • min(x) → [same as input] 返回最小值

  • min(x, n) → array<[same as x]> 返回前 n 个最小值列表

  • sum(x) → [same as input] 求和

窗口函数
  • rank() OVER (PARTITION BY clerk ORDER BY totalprice DESC) AS rnk
  • rank() → bigint 排序,可以存在并列情况
  • row_number() → bigint 排序,从1开始,无重复序号
  • dense_rank() over(partition by bikeno order by substring(log_time,1,10) desc) as ranking
  • sum(totalprice) OVER (PARTITION BY clerk ORDER BY orderdate)
  • row_number() over(partition by a.bike_no order by stop_time desc) 降序排列 所谓的时间的大小。
    请添加图片描述

Hive 常用函数

查看函数详细信息
--显示所有的可用函数,包括运算符、内置函数、自定义函数
show functions;

--显示指定函数的描述信息
desc function trim;

--显示指定函数的详细信息
desc function extended trim;
条件表达式
if(boolean testcondition, true_value,false_value)
select coalesce(null, '100', '50');
floor(double a) -- 向下取整函数 返回不大于 a 的最大整数
ceil(double a)  -- 向上取整函数 返回不小于a的最小整数
log2(double base, double a) -- select log(2, 1024);
pow(double a, double p) -- select pow(2, 5); 32
正则表达式
-- A LIKE B   操作类型:字符类型
-- 描述:如果字符串 A 或字符串 B 为 NULL,则返回 NULL;
-- 如果字符串 A 符合简单 SQL 正则表达式 B 的语法,则为 TRUE;否则为 FALSE。
select 'football' like 'foot____'; -- 字符 ”_” 表示任意单个字符 result:true
select 'football' like 'foot%'; -- 字符 ”%” 表示任意数量的字符
select not 'football' like 'fff%'; -- 否定比较时候用 NOT A LIKE B

-- A RLIKE B   操作类型:字符类型
-- 描述:如果字符串 A 或字符串 B 为 NULL,则返回 NULL;
-- 如果字符串 A 符合 JAVA 正则表达式 B 的正则语法,则为 TRUE;否则为 FALSE。
select 'football' rlike '^f.*l$';

-- A REGEXP B  操作类型:字符类型
-- 描述:功能与 RLIKE 相同
select 1 where 'football' regexp '^f.*l$'; -- ans:1
select 1 where 'football' regexp '^g.*l$'; -- 空

select regexp_replace('foobar', 'oo|ar', '');
select regexp_extract('foothebar', 'foo(.*?)(bar)', 0);
时间函数
-- fom_unixtime(bigint unixtime[, string format])
-- 返回类型:string
-- 说明:转化 UNIX 时间戳(从1970-01-01 00:00:00 UTC 到指定时间的秒数)到当前时区的时间格式。
select from_unixtime(1590000000, 'yyyy-MM-dd');
select from_unixtime(unix_timestamp()-86400,'yyyyMMdd');

-- 语法:unix_timestamp(string date)
-- 返回类型:bigint
-- 说明:转换格式为 “yyyy-MM-dd HH:mm:ss” 的日期到 UNIX 时间戳。如果转换失败,则返回 NULL。

select unix_timestamp('2020-05-21 02:40:00');

-- 语法:unix_timestamp(string date, string pattern)
-- 返回类型:bigint
-- 说明:转换 pattern 格式的日期到 UNIX 时间戳。如果转换失败,则返回 NULL。

select unix_timestamp('20200521 02:40:00', 'yyyyMMdd HH:mm:ss'); -- 1590000000

select to_date('2020-05-21 02:40:00'); -- 2020-05-21

select year('2022-05-21 02:40:00'); -- 2022
select month('2020-05-21 02:40:00'); -- 5
select day('2020-05-21 02:40:00'); -- 21
select hour('2020-05-21 02:40:00'); -- 2
select minute('2020-05-21 02:40:00'); -- 40
select second('2020-05-21 02:40:00'); -- 0
select weekofyear('2022-11-27 02:40:00'); -- 47

select datediff('2022-05-21', '2022-01-01'); -- 140 attention   前面-后面
select date_add('2020-05-21', 10); -- 2022-05-31
字符串函数
select length('abcedfg');
select reverse('abcedfg');
select concat('abc', 'def', 'gh');
select concat_ws(',', 'abc', 'def', 'gh');
select substr('abcde', 3, 2);
select upper('Apple');

select split('ab,cd,ef', ',');
select find_in_set('cd','{ab,cd,ef}');
select lpad('abc', 10, '#'); -- ##########abc
json 函数
select get_json_object('{"name":"zs","age":"25"}', '$.name');-- zs

猜你喜欢

转载自blog.csdn.net/F13122298/article/details/128061987