美文网首页
Hive应用 | 高阶函数

Hive应用 | 高阶函数

作者: 木衍小哥 | 来源:发表于2021-12-23 08:39 被阅读0次

    1、窗口函数

    常用到的Hive窗口函数具体有:row_number()、rank()、dense_rank() 这三个窗口函数,具体区别主要有:

    • row_number:不管排名是否有相同的,都按照顺序1,2,3…..n

    • rank:排名相同的名次一样,同一排名有几个,后面排名就会跳过几次

    • dense_rank:排名相同的名次一样,且后面名次不跳跃

    1)row_number()

    代码如下所示:

    SELECT user_id,
           order_id,
           row_number() OVER(PARTITION BY user_id order by order_id DESC) as rn
    FROM access_cdm.dwd_trade_order_goods_dd_f
    WHERE dt = '2021-08-25' AND user_id IN(7822416, 66440,10386724, 2613996)
    LIMIT 100;
    

    结果展示如下:

    image

    2)rank()

    代码如下所示:

    SELECT user_id,
           order_id,
           rank() OVER(PARTITION BY user_id order by order_id DESC) as rn
    FROM access_cdm.dwd_trade_order_goods_dd_f
    WHERE dt = '2021-08-25' AND user_id IN(7822416, 66440,10386724, 2613996)
    LIMIT 100;
    

    查询结果如下:

    image

    3)dense_rank()

    代码如下所示:

    SELECT user_id,
           order_id,
           dense_rank() OVER(PARTITION BY user_id order by order_id DESC) as rn
    FROM access_cdm.dwd_trade_order_goods_dd_f
    WHERE dt = '2021-08-25' AND user_id IN(7822416, 66440,10386724, 2613996)
    LIMIT 100;
    

    查询结果如下:

    image

    2、排序函数

    (1)order by

    hive中的 order by 会对查询结果集执行一次全局排序,这也就是说所有的数据都通过一个reduce进行处理的过程,对于大数据集,这个过程将消耗很大的时间来执行。

    (2)sort by

    hive中的 sort by 也就是执行一个局部排序过程。这可以保证每个reduce的输出数据都是有序的(但并非全局有序)。这样就可以提高后面进行的全局排序的效率。用户可以指定任意期望进行排序的字段,并可以在该字段后面加上asc关键字(默认)表示升序,desc关键字是降序排列。

    在使用 sort by 之前,需要先设置 reduce 的数量 > 1,才会做局部排序,如果reduce数量是1,作用与 order by 一样,全局排序。

    (3)distribute by

    distribute by 控制 map 的输出在 reducer 中是如何划分的,mapReduce job中传输的所有数据都是按照键-值对的方式进行组织的,因此hive在将用户的查询语句转换成mapReduce job时,其必须在内部使用这个功能。默认情况下,MapReduce计算框架会依据map输入的键计算相应的哈希值,然后按照得到的哈希值将键-值对均匀分发到多个reducer中去。

    (4)cluster by

    cluster by 除了 distribute by 的功能外,还会对该字段进行排序,所以 cluster by = distribute by + sort by。但是排序只能是倒叙排列,不能指定排序规则为ASC或者DESC。

    3、行列转换函数

    (1)lateral view explain

    Lateral view 其实就是用来和像类似于explode这种UDTF函数联用的。lateral view 会将UDTF生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行即每个game_id 进行join 来达到连接UDTF外的select字段的目的。

    lateral view explode 函数举例如下:

    SELECT game_id, user_id
    FROM test_table AS t
    lateral view explode(split(user_ids, ',')) sn_table AS user_id
    

    相关文章

      网友评论

          本文标题:Hive应用 | 高阶函数

          本文链接:https://www.haomeiwen.com/subject/deqhqrtx.html