SparkSQL多个count distinct 执行效率优化

server/2024/12/17 3:34:50/

        写了一段非常简单的SQL。 数据量级一天大约5千万,拉取的30天的数据,按天 count(distinct)计算一系列指标。原本以为执行的效率会很快,结果发现运行了2h!所有探究其为什么运行慢,以及后续该如何规避这类问题。Spark使用的版本是3.x,SQL示例如下:

    SELECT dt

        , COUNT(DISTINCT a) as uv -- 用户数

        , COUNT(DISTINCT b) as pay_uv_1d

        , ... 类似诸如此类的count distinct 一共有30多个指标

    FROM

    (

        SELECT *

        FROM table

        WHERE dt BETWEEN DATE_SUB('${dt}',29) AND '${dt}'

    ) tmp

    GROUP BY dt

        单个count distinct 和普通的shuffle类型,经历map端预聚合,然后shuffle到reduce端最终聚合的方式,就把最终的结果给统计出来了。

多个count distinct 执行原理:

        但是多个 count distinct 的逻辑和普通的shuffle确有点不太一样,它会多了一个Expand节点,这个节点会将产生数据膨胀,有N个count distinct 数据就会膨胀N倍,最终这里导致的执行耗时非常之长。

        例如有这样一条数据:

dtab
2024-12-15aabb

        会膨胀成如下样子,再按照a 和 b为key 分别进行group by去重,然后再count,就最终实现了多个count distinct 计算了:

dtab
2024-12-15aanull
2024-12-15nulla

多个count distinct 优化:

        了解了多个count distinct 原理之后,优化就大致有思路了。

        1. 首先还是得简化SQL,看看能不能不通过count distinct处理 或者 提前过滤掉一些不必要的数据,尽量减少膨胀的数据量

        2. 将多个count distinct 拆开分在多段SQL中写,防止膨胀不需要膨胀的数据。

        3. 进行spark参数的优化,目前个人优化了如下几个参数:

                spark.sql.files.maxPartitionBytes(读取数据单个task读取更少的数据,设置为16m 16777216,默认为128m)

                spark.sql.shuffle.partitions 设置为1w,增大partition的数目,减少单个partiton处理的数据量

参考:

      sparksql源码系列 | 一文搞懂with one count distinct 执行原理

      再来说说sparksql中count(distinct)原理和优化手段吧~-腾讯云开发者社区-腾讯云

      collect set函数 spark sql spark count distinct_mob6454cc716fb0的技术博客_51CTO博客


http://www.ppmy.cn/server/150796.html

相关文章

xpath规则

路径表达式 谓语 用来查找某个特定的节点或者包含某个指定的值的节点 谓语被嵌在方括号中 选择未知节点 选取若干路径 使用“|”运算符 python中lxml使用 from lxml import etree import requests # 参数往往是一个html字符串 url "https://www.baidu.com/" hea…

Scala隐式转换的其他使用场景

1. 类型的隐式参数 隐式转换可以与类型参数一起使用,以便在需要类型参数时自动提供。例如: trait Show[T] {def show(value: T): String }def printValue[T](value: T)(implicit showInstance: Show[T]): Unit {val str showInstance.show(value)pri…

基于Dockerfile的博客管理系统的容器化部署

目录 任务描述 3 1.1课题的基本内容 3 1.2 项目整体技术架构 3 1.3主要技术栈: 3 1.4 模块划分 4 1.5 容器集群化部署的任务内容 5 1.6 项目容器化部署的目的 6总体结构 7 2.1 容器角色和功能 7 2.2 容器之间的关联关系 8 2.3 数据流动示例 8 3.详细设计 9 3.1 设计…

分布式 分布式事务 总结

前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节…

Redis 数据结构(二)—集合和有序集合

集合(Set)允许用户将多个各不相同的元素(文本或二进制数据)存储到集合中,以无序的方式存储元素。 有序集合(Sorted Set)同时具有“有序”和“集合”两种性质。每个元素由一个成员和分值组成。成…

react中使用echarts

在 React 中使用 ECharts,可以通过以下几个步骤来实现: 1. 安装依赖 首先,需要安装 echarts 和 echarts-for-react 这两个库,echarts-for-react 是一个 React 封装的 ECharts 组件库。 npm install echarts echarts-for-react2…

java 导出word锁定且部分内容解锁可编辑

使用 Apache POI 创建带编辑限制的 Word 文档 在日常工作中,我们可能需要生成一些带有编辑限制的 Word 文档,例如某些段落只能被查看,而其他段落可以自由编辑。本文介绍如何使用 Apache POI 创建这样的文档,并通过代码实现相应的…

Github 2024-12-15 php开源项目日报Top10

根据Github Trendings的统计,今日(2024-12-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Matomo:开源网站分析平台 创建周期:4687 天开发语言:PHP协议类型:GNU General Public License v3.0Star数量:18681 个Fork数量:…