千家信息网

Hive有哪些常见函数

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,本篇内容主要讲解"Hive有哪些常见函数",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hive有哪些常见函数"吧!1. HQL 判断空的函数https:/
千家信息网最后更新 2024年11月25日Hive有哪些常见函数

本篇内容主要讲解"Hive有哪些常见函数",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hive有哪些常见函数"吧!

1. HQL 判断空的函数

https://www.w3school.com.cn/sql/func_date_format.asp

2. 时间转换函数

year(string date):返回年份部分的日期或时间戳字符串:year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970

https://blog.csdn.net/wzzfeitian/article/details/55097563

https://www.yiibai.com/hive/hive_built_in_functions.html

3. group by 函数,需要多次进行分组

数据类型转换:https://blog.csdn.net/qq_31573519/article/details/100139218

4. hive获取上个月第一天和最后一天的时间

//获取上个月第一天date('Y-m-01',strtotime('-1 month')); //获取上个月最后一天date('Y-m-t',strtotime('-1 month'));
SELECT--上个月第一天concat(SUBSTR(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),DAY(FROM_UNIXTIME(UNIX_TIMESTAMP()))),1,7) ,'-01'),--上个月最后一天DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),DAY(FROM_UNIXTIME(UNIX_TIMESTAMP())))select--上个月第一天trunc(add_months(CURRENT_TIMESTAMP,-1),'MM'),--上个月第一天concat(substr(add_months(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),-1),1,7),'-01'),--上个月最后一天date_sub(trunc(CURRENT_TIMESTAMP,'MM'),1);

5. 当月第一天

-- 当月第一天SELECT TRUNC(sysdate(0), 'MM') ;

6. 前两个月第一天

-- 前两个月第一天select TRUNC(add_months(CURRENT_TIMESTAMP, -2), 'MM');

7. CAST 转换小数保留位数

cast(column_name as decimal(10,2)) cast函数四舍五入(推荐使用)select cast(68.666666666666668 as decimal(10,2));_c068.67select cast(68.666666666666668 as decimal(10,3));_c068.667

8. 求两数除数,保留两位小数

ROUND((SUM(delivered_num) / SUM(plan_num) * 100),2)cast(column_name as decimal(10,2)) cast函数四舍五入(推荐使用)CAST((SUM(delivered_num) / SUM(plan_num) * 100) AS DECIMAL(10, 2))

9. Presto 引擎的数值转换

SELECT CAST(    CAST('913' AS DOUBLE) / CAST('1000' AS DOUBLE) * cast('100' as DOUBLE) as DECIMAL(10,2));先转成 double,在进行乘除运算,最后再转成 decimal==> 91.3列别名一定要用"双引号"

10. if 语句

if null 判断语句

函数:1. coalesce( value1,value2,… )2. if( value1 is null, value2, value1)IF( Test Condition, True Value, False Value ) 例子:hive> select coalesce(col1, col2, cols) as res1, if(col1 is null, if(col2 is null, col3, col2), col1) as res2    > from(    >     select 1 as col1, 2 as col2, 3 as col3     >     union all    >     select null as col1, 2 as col2, 3 as col3     >     union all    >     select null as col1, null as col2, 3 as col3     >     union all     >     select null as col1, null as col2, null as col3    > ) as test结果:    res1   res2    1      1    2      2    3      3    null   null

11. 一对多表关联去重统计

背景:假设我们是一个电商网站,用用户下单,订单有来源数据,每个订单会有多个订单明细,订单明细记录了商品相关信息、以及商品的出库、发货、收货时间都不同。

需求:想要统计订单维度相关的数据,要求统计出订单不同来源下的出库单量、发货单量、收货单量。

分析:订单和订单明细是一对多的关系,一个订单有多个明细,每个明细的商品都有各自的出库、发货、收货时间,也有可能未及时发货、出库、收货之类的导致为空,想要按照订单维度统计这些量,只需要判断订单中对应的多个明细中,只有出库、发货。收货时间即可,然后再汇总。

实现:

  1. 先统计基础的数据,订单与订单明细关联,查询订单id、订单来源、以及根据出库时间、发货时间、收货时间是否存在来判断是否出库、是否发货、是否收货;

  2. 根据订单来源、订单id进行分组,然后利用单行函数 max 取出具体id分组下的是否出库、发货、收货值;

  3. 最后在统计上一步查的数据,再按照订单来源分组,利用单行函数 sum 来求订单总数、出库、发货、收货总单量。

此时就需要使用 group by 进行分组,同时,分组完毕之后,在 select 列上需要针对未分组的字段进行单行函数,比如 max、min、sum等等。

with base_data as (        select                source, -- 下单来源                max(if_out) if_out, -- 是否出库                max(if_send) if_send, -- 是否发货                max(if_received) if_received -- 是否收货        from (                select                        o.id, -- 订单id                        o.source, -- 来源                        (                                case when od.out_time is not null then 1                                else 0                                end                        ) as if_out, -- 是否出库                        (                                case when od.send_time is not null then 1                                else 0                                end                        ) as if_send, -- 是否发货                        (                                case when od.received_time is not null then 1                                else 0                                end                        ) as if_received -- 是否收货                from order o                left join order_detail od on o.id = od.order_id                where o.create_time > '2021-04-01'        ) a         group by source,id)select        source, -- 下单来源        sum(1), -- 订单数量        sum(if_out), -- 出库总单量        sum(if_send), -- 发货总单量        sum(if_received) -- 收货总单量from base_datagroup by source

其实就是一个订单包含多个商品数据,每个商品的三种不同的时间都不同,想要算按照整个订单来统计三个时间,只需要取订单对应的多个商品数据,取它们的最小或最大时间来进行分组统计。

注意 distinct 只是针对整行数据去重,如果查询结果有多列,比如 user_id、name、age、order_id 等等,查询的数据中 user_id、name、age 都是一样的,但是 order_id 有多个,那么使用 distinct 只会去除四个字段相同的行数据。

到此,相信大家对"Hive有哪些常见函数"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0