问题背景

设想你对用户在不同品类上的行为打分聚合后得到这样一个表 user_cate_score

uid

cate

score

1

1

0.3

2

2

0.5

8

3

0.9

现在,你想将每个品类的TOP 100W 用户取出来,这种场景在推荐、营销中很常见。

基本方法

这个很容易通过窗函数写出如下解法

select uid, cate, scorefrom(

    select uid, cate, score, row_number() over (partition by cate order by score desc) as r

    from user_cate_score)T where r <= 1000000

通过窗函数row_number()在每个cate分区上按照score排序,得到row_number,然后取TOP 100W即可。

问题: Hive在执行的时候由于每个partition会分到一个reducer上,这导致单个reducer处理的数据量非常大,严重拖慢执行时间,没法充分利用到分布式的效率。

改进方法

近似取TOP 100W

select uid, cate, scorefrom(

    select uid, cate, score, row_number() over (partition by cate,rnd  order by score desc) as r

    from(

        select *, cast(rand() * 100 as int) as rnd

        from user_cate_score

    )Ta)Tbwhere r <= 10000

思路: 加上一个0-100的随机数进行partition,可以将一个cate分散到100个reducer上执行,然后对每个cate的每个reducer取TOP 1W,就近似实现了对每个cate取TOP 100W。好处,速度快了很多。

Hive-分区取TOP N问题的更多相关文章

  1. Hive分组取Top K数据

    阿里交叉面试问到了这个题,当时感觉没有答好,主要是对Hive这块还是不熟悉,其实可以采用row_number()函数. 1.ROW_NUMBER,RANK(),DENSE_RANK() 语法格式:ro ...

  2. Hive分组取Top N

    Hive在0.11.0版本开始加入了row_number.rank.dense_rank分析函数,可以查询分组排序后的top值   说明: row_number() over ([partition ...

  3. hive -- 分区,分桶(创建,修改,删除)

    hive -- 分区,分桶(创建,修改,删除) 分区: 静态创建分区: 1. 数据: john doe 10000.0 mary smith 8000.0 todd jones 7000.0 boss ...

  4. Hive中SELECT TOP N的方法(order by与sort by的区别)

    我想说的SELECT TOP N是取最大前N条或者最小前N条. Hive提供了limit关键字,再配合order by可以很容易地实现SELECT TOP N. 但是在Hive中order by只能使 ...

  5. sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据

    SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...

  6. Oracle:分割字符串 取TOP N条记录

    oracle数据库,表数据如下: ids                           id 3,4,5                        7 13,14,15,16         ...

  7. row_number和partition by分组取top数据

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...

  8. 从m个数中取top n

    将题目具体一点,例如,从100个数中取出从大到小排前10的数 方法1:使用快速排序 因为快速排序一趟下来,小于K的数都在K的前面,大于K的数都在K的后面 如果,小于K的数有35个,大于K的数有64个 ...

  9. SQL Server 分组后取Top N

    SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...

  10. Hive分区(静态分区+动态分区)

    Hive分区的概念与传统关系型数据库分区不同. 传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区. Hive的分区方式:由于Hive实 ...

随机推荐

  1. Java 21新特性-虚拟线程 审核中

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@benweidig/looking-at-java-21-virtual-threads-0ddda4ac1be1 ...

  2. docker目录迁移流程

    概述 在安装测试最新版本的HOMER7的过程中,docker作为基础工具碰到一些问题,针对问题进行总结. docker的默认工作目录在/var目录,而在我们的环境中,/var目录空间预留不足,随着do ...

  3. 小白学正则表达式之 regexp

    1. 正则表达式介绍 正则表达式是程序文本处理常用的模板模式,按照解析正则表达式的引擎可将正则表达式分为 POSIX 基础正则表达式(Basic regular expression,BRE) 引擎和 ...

  4. Kubernetes 权限管理

    1. 概述 Kubernetes 中用户分登陆用户和 service account.登陆用户可通过 kubectl config 查看上下文,以及当前上下文: [root@chunqiu ~ (Ma ...

  5. 分享 ASCII 字符集的字模

    是做 VGA 显示屏时用到的,这是字模资源:gitee 链接 以下为字模代码: // 133 * 16 * 8 字模的 parameter reg [127:0] C_ascii_character ...

  6. docker 安装 ElasticSearch 和 Kibana 及ik 中文分词器

    本文为博主原创,未经允许不得转载: 1. 使用 docker 下载 elasticsearch  7.6.1 docker pull elasticsearch:7.6.1 2. 启动 elastic ...

  7. 【收集】C & C++

    序 链接 备注 1 C语言0长度数组(可变数组/柔性数组)详解_CHENG Jian的博客-CSDN博客_0数组   2 C 语言参考 | Microsoft Learn   3 C++ 语言参考 | ...

  8. 【RTOS】基于RTOS的嵌入式系统看门狗策略

    RTOS - high integrity systems 看门狗策略 Watchdog Strategies for RTOS enabled embedded systems 介绍 看门狗定时器就 ...

  9. .NET技术面试题系列(2) -sql server数据库优化规范

    1.数据库优化规范 a.索引 每个表格都要求建立主键,主键上不一定需要强制建立聚集索引. 聚集索引,表中存储的数据按照索引的顺序存储,即逻辑顺序决定了表中相应行的物理顺序,因此聚集索引的字段值应是不会 ...

  10. [转帖]K8s Pod Command 与容器镜像 Cmd 启动优先级详解

    https://cloud.tencent.com/developer/article/1638844 前言 创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数.如果要设置命令,就填写在 ...