Hive PERCENTILE_APPROX 函数详解

ops/2025/1/23 1:20:17/

Hive PERCENTILE_APPROX 函数详解

PERCENTILE_APPROX 是 Hive 中一个重要的函数,用于近似计算数据的百分位数。本文介绍 PERCENTILE_APPROX 的原理、参数以及核心概念 B 值等信息。


函数语法

PERCENTILE_APPROX(expression, percentage [, B])
  • expression: 输入的数值列,通常是需要计算百分位数的字段。
  • percentage: 百分位数,取值范围为 0 到 1,例如:0.5 表示中位数。
  • B: (可选)样本精度参数,控制采样点数量,默认为 10,000

B 值是什么?

PERCENTILE_APPROX 中,B 值是样本精度参数,用于控制近似百分位计算时使用的样本大小。它代表在计算过程中保存的 数据压缩点数量

B 值的作用

  1. 控制样本大小

    • 数据集通常可能很大,直接对整个数据集计算百分位会消耗巨大的资源。
    • B 值决定了采样时保存的数据点数量:
      • B 越大,样本越多,结果越精确。
      • B 越小,样本越少,结果的近似误差会增加。
  2. 平衡内存和精度

    • 高 B 值:需要更多内存,但结果更精确。
    • 低 B 值:节省内存,但可能导致误差增加。

原理及影响

算法原理

PERCENTILE_APPROX 使用了一种类似于 TDigest 压缩算法 的方法:

  • 数据经过分组和排序后,压缩为少量数据点(称为压缩点)。
  • 这些压缩点用来估算数据分布,从而计算近似的百分位数。
  • B 值决定了压缩点的数量,更多压缩点能够更准确地捕捉数据分布。

B 值的效果

B 值结果偏差内存占用计算速度适用场景
1,000±2%资源受限、快速估算时使用
10,000±0.5%中等中等默认值,适合大多数场景
50,000±0.1%需要高精度时使用

示例

使用默认 B 值(10,000)

SELECT PERCENTILE_APPROX(value, 0.5) AS median
FROM your_table;

自定义 B 值(5,000)

SELECT PERCENTILE_APPROX(value, 0.5, 5000) AS median
FROM your_table;

更高精度(50,000)

SELECT PERCENTILE_APPROX(value, 0.5, 50000) AS median
FROM your_table;

如何选择合适的 B 值?

  1. 数据规模

    • 小规模数据集(<1,000,000 行):使用高 B 值(如 20,000 或更高)。
    • 大规模数据集(>10,000,000 行):选择默认值 10,000,或根据资源调整。
  2. 性能需求

    • 快速估算:选择低 B 值(1,000 - 5,000)。
    • 高精度需求:选择高 B 值(>10,000)。
  3. 内存资源

    • 内存足够:选择较大的 B 值以提高精度。
    • 内存受限:选择较小的 B 值避免计算内存溢出。

总结

  • B 值是控制样本数量的参数,直接影响采样精度。
  • 默认值(10,000)适合大多数场景,能够很好地平衡计算精度和性能。
  • 根据具体的数据规模、性能需求和内存资源,可以调整 B 值来优化结果。

通过合理设置 PERCENTILE_APPROX 的参数,您可以高效计算大数据集的百分位数,既能节省资源,又能保证计算结果的精度。


http://www.ppmy.cn/ops/152326.html

相关文章

20250118面试鸭特训营第26天

更多特训营笔记详见个人主页【面试鸭特训营】专栏 1.说下你常用的 Linux 命令&#xff1f; 文件与目录操作 命令描述ls列出当前目录和文件和子目录ls -l列出当前目录和文件和子目录&#xff0c;包括详细信息ls -a列出当前目录和文件和子目录&#xff0c;包括隐藏文件cd切换目…

实现宿主机(Windows 10 Docker Desktop)和Linux容器之间的数据挂载的三种方法

在Windows 10上使用Docker Desktop运行Linux容器时&#xff0c;经常需要将宿主机上的文件或目录与容器内的文件或目录进行关联&#xff0c;以便实现数据的共享和持久化。Docker提供了多种方法来实现这一目标&#xff0c;包括使用-v选项挂载宿主机目录、创建Docker数据卷以及使用…

大文件上传服务-后端V1V2

文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节&#xff0c;把之前做的项目拿过来总结一下&#xff0c;自己写的一个…

【PCL】Segmentation 模块—— 欧几里得聚类提取(Euclidean Cluster Extraction)

1、简介 PCL 的 Euclidean Cluster Extraction&#xff08;欧几里得聚类提取&#xff09; 是一种基于欧几里得距离的点云聚类算法。它的目标是将点云数据分割成多个独立的簇&#xff08;clusters&#xff09;&#xff0c;每个簇代表一个独立的物体或结构。该算法通过计算点与点…

JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南

1、简述 在复杂的业务系统中&#xff0c;订单流程往往需要一系列的操作&#xff0c;比如验证订单、检查库存、处理支付、更新订单状态等。责任链模式&#xff08;Chain of Responsibility&#xff09;可以帮助我们将这些处理步骤分开&#xff0c;并且以链式方式处理每一个操作…

Docker部署MySQL 5.7:持久化数据的实战技巧

在生产环境中使用Docker启动MySQL 5.7时&#xff0c;需要考虑数据持久化、配置文件管理、安全性等多个方面。以下是一个详细的步骤指南。 1. 准备工作 &#xff08;1&#xff09;创建挂载目录 在宿主机上创建用于挂载的目录&#xff0c;以便持久化数据和配置文件。 sudo mkdi…

Freemarker和ItextPDF实际应用

1. FreeMarker模板文件路径 确保FreeMarker模板文件位于正确的路径&#xff0c;并通过Spring Boot自动加载。模板文件放在 src/main/resources/templates/ 目录下&#xff0c;FreeMarker会自动处理这些文件。 Configuration public class FreeMarkerConfig {Value("${sp…

Walrus Learn to Earn计划正式启动!探索去中心化存储的无限可能

本期 Learn to Earn 活动将带领开发者和区块链爱好者深入探索 Walrus 的技术核心与实际应用&#xff0c;解锁分布式存储的无限可能。参与者不仅能提升技能&#xff0c;还能通过完成任务赢取丰厚奖励&#xff01;&#x1f30a; 什么是 Walrus&#xff1f; 数据主权如今正成为越…