pyspark的approx_count_distinct中rsd的解释是什么以及更改它的后果是什么?

2024-07-03

在 pyspark 的近似计数不同 https://spark.apache.org/docs/3.1.2/api/python/reference/api/pyspark.sql.functions.approx_count_distinct.html函数有一个精度参数rsd。它是如何工作的?如果增加或减少,会有什么权衡?我想对于这个应该明白如何approx_count_distinct已实施。你能帮我理解吗rsd在逻辑背景下approx_count_distinct?


rsd是“相对标准差”的缩写,默认值为0.05。使用此值,您可以控制在不同计数上您愿意接受的错误是什么。正如 @Derek O 在上面的评论中所描述的,approx_count_distinct函数在准确性之间进行权衡(您可以使用rsd参数)和计算速度。

为了更多地了解底层算法,我们可以快速浏览一下该算法的实现approx_count_distinct https://github.com/apache/spark/blob/fbbcf9434ac070dd4ced4fb9efe32899c6db12a9/sql/core/src/main/scala/org/apache/spark/sql/functions.scala#L286-L296功能。我们看到它使用了 HyperLogLogPlusPlus 算法(对超级日志日志 https://en.wikipedia.org/wiki/HyperLogLog算法)。

  /**
   * Aggregate function: returns the approximate number of distinct items in a group.
   *
   * @param rsd maximum relative standard deviation allowed (default = 0.05)
   *
   * @group agg_funcs
   * @since 2.1.0
   */
  def approx_count_distinct(e: Column, rsd: Double): Column = withAggregateFunction {
    HyperLogLogPlusPlus(e.expr, rsd, 0, 0)
  }

阿帕奇火花的执行 https://github.com/apache/spark/blob/fbbcf9434ac070dd4ced4fb9efe32899c6db12a9/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/HyperLogLogPlusPlus.scala#L28-L42这个的HyperLogLogPlusPlus算法基于以下论文(Spark v3.3.1,撰写本文时):

  • HyperLogLog:近最优基数估计算法的分析 http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf(此链接已损坏,但为了完整性我将其添加)
  • HyperLogLog 实践:最先进的基数估计算法的算法工程 http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/40671.pdf
  • HyperLogLog 实践附录:最先进基数估计算法的算法工程 https://docs.google.com/document/d/1gyjfMHy43U9OWBXxfaeG-3MjGzejW1dlpyMwEYAAWEI/view?fullscreen#
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pyspark的approx_count_distinct中rsd的解释是什么以及更改它的后果是什么? 的相关文章

  • 使用 MySQL 变量选择分层数据

    我有一个表 用于存储目录信息 就像在文件系统中一样 每个目录 命名节点 都有一个nodeid and a parentid 我想尽可能有效地检索完整路径 为此 我试图使以下查询起作用 但这些查询仅返回第一个预期行 实际上是最内部的目录 任何
  • 如何使用 Apache Spark 读取/写入协议缓冲区消息?

    我想使用 Apache Spark 从 HDFS 读取协议缓冲区消息 向 HDFS 写入协议缓冲区消息 我发现了这些建议的方法 1 使用Google的Gson库将protobuf消息转换为Json 然后通过Spark Sql读取 写入它们
  • Postgres / Rails Active Record -- 查询舍入浮点值

    我在 Rails 应用程序中使用 Postgres 将纬度 经度作为浮点值存储在数据库中 我希望能够比较位置的纬度 经度 但我只知道如何做到完全相等 Location where lat lat lon lon 我的问题是 我希望 Post
  • C# 使用 SqlCommand.Parameters 更新表

    我正在尝试使用 Sql 命令更新 SQL 表 我认为这是我的 T SQL 的语法错误 但这是我到目前为止所得到的 SqlCommand sqlCmd new SqlCommand UPDATE yak tickets SET email e
  • 将具有外键的第三个表中的记录复制到其他表

    我有三个表 表 1 作为主表 表 2 作为表 1 的详细信息 表 3 作为表 2 的详细信息 TABLE1 PK1 INTEGER FD1 VARCHAR 100 TABLE2 PK2 INTEGER FK1 INTEGER FD2 VAR
  • 如何插入只有一个 IDENTITY 列的表?

    在尝试回答的过程中提出了这个问题另一个 https stackoverflow com questions 850017 how to manage groups in the database 850049 850049 考虑下面的 MS
  • 在 redshift 上查询数据时出错 - 获取条带数据时出错

    我正在尝试在 redshift 中的外部表上运行以下查询 select from schema table limit 10 我收到一个错误 2018 06 20 12 03 14 XX000 500310 Amazon 无效操作 S3 查
  • 更改 SQL Server 中的列

    什么是正确的语法ALTER语句向现有列添加默认值 我可以毫无错误地添加新列 ALTER TABLE tb TableName ADD Record Status varchar 20 但是如果我尝试使用以下语句更改现有列以应用默认值 ALT
  • 除了结构化 XML 数据之外,还选择行数据

    我知道如何将 XML 变量连接到其他表 但在本例中 我尝试从表中选择每一行以及 XML 的结构从每个相应的表行 在那一行旁边 我无法在网上找到任何示例来帮助解决此问题 因为大多数示例都处理单个 XML 值 抱歉 如果有的话 我无法在无数其他
  • 数据库异常 - 一般错误:1021 磁盘已满

    谁能帮我理解为什么这个查询说光盘已满 数据库异常 SQLSTATE HY000 一般错误 1021 磁盘已满 tmp sql 1445 3 MAI 等待有人释放一些空间 错误号 28 设备上没有剩余空间 Query 这是服务器问题 只有楼主
  • 带/不带“ORDER BY”的 CosmosDB sql 查询返回不同数量的项目

    我正在从我的 Web 服务查询 cosmosdb sql 数据库 只需调用 Microsoft Azure Documents Client Version 1 18 0 0 DocumentClient CreateDocumentQue
  • 使用sql删除重复行

    我正在尝试从 mysql 表中删除重复的行 我尝试了多个查询 但不断收到此错误 1093 You can t指定目标表 usa city 以在 FROM 子句中进行更新 该表如下所示 usa city id pk id state city
  • SQL Loader 脚本帮助添加 SYSDATE、USER

    我正在尝试从文件加载数据 并且想将 CREATED DATE 和 UPDATED DATE 设置为 SYSDATE 将 CREATE BY 和 UPDATED BY 设置为 USER 这是我正在使用的表 CREATE TABLE CATAL
  • 通过 SQL 查询安全地标准化数据

    假设我有一张客户表 CREATE TABLE customers customer number INTEGER customer name VARCHAR customer address VARCHAR 这张表确实not有一个主键 然而
  • 如何清除实体框架中的待定更改

    我有一些表数据DbContext我不想保存 我已经删除了数据库 重新设置了它 但是挂起的更改不会消失DbContext 重建数据库后 我的数据库表为空 但是当我将实体作为对象列表调用时 它仍然包含旧对象 关于如何清除旧的待处理数据有什么建议
  • 使用两列的 T-SQL“不在其中”

    我想从表 T1 中选择所有记录 其中 A 列和 B 列中的值与表 T2 中的 C 列和 D 列没有匹配的元组 In mysql Where not in 使用两列 https stackoverflow com questions 8435
  • Django QuerySet 中计算列的总和

    鉴于以下情况Contribution model class Contribution models Model start time models DateTimeField end time models DateTimeField n
  • PostgreSQL 使用“lag()”窗口函数更新查询

    我有一个涉及Postgresql数据库的任务 我对 SQL 不太有经验 我有一张贸易产品每周营业额的表格 每周提供以下信息 产品 周数 周营业额 可能是正值或负值 具体取决于天气 更多产品被购买或出售 我添加了一栏 其中包含每周的期末余额
  • 获取每个人每天的最短日期时间的记录

    CREATE TABLE IF NOT EXISTS accesscards id int 11 NOT NULL AUTO INCREMENT department varchar 255 NOT NULL name varchar 25
  • SQL 关键字使用大写有充分的理由吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 默认值似乎是大写 但是真的有理由使用大写关键字吗 I started using upper case because I was just t

随机推荐