hive常用函数整理

  1. 关于日期

  1. datediff(date1, date2)

  • 返回date1与data2之间的天数;

  1. date_sub(start_day, num_days)

  • 返回start_day前num_days的日期;

  1. timestampdiff():

  • timestampdiff(year|month|day|hour|minute|second,date1,date2)

  • #对于比较的两个时间,时间小的放在前面,时间大的放在后面

  1. 窗口函数

1.FIRST_VALUE()函数

  • FIRST_VALUE()函数用于返回当前第一个值

SELECT *,
    FIRST_VALUE(order_price) OVER (PARTITION BY user_id ORDER BY order_price) AS firstvalue 
FROM order_content;

2. LAST_VALUE()函数

  • LAST_VALUE()函数用于返回当前最后一个值

  • last_value(字段, true): 会跳过 为null值的数据,并将最后一个值填充进去。

SELECT *,
   LAST_VALUE(order_price) OVER (PARTITION BY user_id ORDER BY order_price)AS lastvalue 
FROM order_content;

3. lag() 和 lead()

这两个函数可以查询我们得到的结果集上下偏移相应行数的相应的结果

  • lag():查询当前行向上偏移n行对应的结果

  • 该函数有三个参数:第一个为待查询的参数列名,第二个为向上偏移的位数,第三个参数为超出最上面边界的默认值。

-- 查询向上偏移 1 位的年龄

SELECT user_id,
       user_age,
       lag(user_age, 1, 0) over(ORDER BY user_id) RESULT
FROM user_info;
  • lead()函数:查询当前行向下偏移n行对应的结果

  • 该函数有三个参数:第一个为待查询的参数列名,第二个为向下偏移的位数,第三个参数为超出最下面边界的默认值。

--查询向下偏移 2 位的年龄

SELECT user_id,
       user_age,
       lead(user_age, 2, 0) over(ORDER BY user_id)
  FROM user_info;

  1. 其他

  • COALESCE()

对于Oracle数据库,一般经常对空值处理的函数为NVL,而mysql中常用到的是ifnull,这两个函数相似,其实都是由一个函数衍生而来,那就是COALESCE()函数。

COALESCE()函数 定义:返回列表中第一个非null表达式的值。如果所有表达式求值为null,则返回null

COALESCE()函数有两种用法:

  1. COALESCE ( expression1, expression2 );

  1. COALESCE ( expression1, expression2, ... expression-n );

其中第一种就相当于Oracle中的nvl或者mysql中的ifnull,写成表达式的形式为:

CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE expression2 END;

第二种可以包含n个表达式,表示如果第一个不为空取第一个,否则判断下一个,以此类推,如果全部为空,则返回null值。

需注意:vertica中空字符串跟null值不一样


  1. UDTF

  • EXPLODE(col):将hive表的一列中复杂的array或者map结构拆分成多行。

  • 单列Explode

需求:将student这一列中数据由一行变为多行(使用split和explode,并结合lateral view函数实现)

select
    class,student_name
from
    default.class_info
    lateral view explode(split(student,',')) t as student_name;

  • Posexplode(): 实现explode()函数基础上,加编号。

需求:想要给每班的每个同学按照顺序来一个编号(使用posexplode函数)

select
    class,student_index + 1 as student_index,student_name
from
    default.class_info
    lateral view posexplode(split(student,',')) t as student_index,student_name;
  • LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AScolumnAlias

解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UDTF会报一行拆分成一行或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。


5. UDAF

  • CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

  • CONCAT_WS(separator, str1, str2,...):

  • 它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。

  • 分隔符可以是与剩余参数一样的字符串。

  • 如果分隔符是 NULL,返回值也将为 NULL.

  • 这个函数会跳过分隔符参数后的任何 NULL 和空字符串。

  • 分隔符将被加到被连接的字符串之间;

  • 注意: CONCAT_WS must be "string or array<string>

  • COLLECT_SET(col):它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

  • COLLECT_LIST(col): 它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。

猜你喜欢

转载自blog.csdn.net/m0_57126939/article/details/129689587