在 Spark SQL 中查找多个双数据类型列的中位数

2023-11-26

我需要找到多个双数据类型列的中位数。请求建议以找到正确的方法。

下面是我的示例数据集,其中有一列。我期望我的样本的中值返回为 1。

  scala> sqlContext.sql("select num from test").show();
+---+
|num|
+---+
|0.0|
|0.0|
|1.0|
|1.0|
|1.0|
|1.0|
+---+

我尝试了以下选项

1) Hive UDAF 百分位数,仅适用于 BigInt。

2) Hive UDAT percentile_approx,但它没有按预期工作(返回 0.25 vs 1)。

sqlContext.sql("从测试中选择percentile_approx(num,0.5)").show();

+----+
| _c0|
+----+
|0.25|
+----+

3)Spark窗口函数percent_rank-查找中位数的方法是查找所有高于0.5的percent_rank并选择最大percent_rank对应的num值。但它并不适用于所有情况,特别是当我有偶数记录计数时,在这种情况下,中位数是排序分布中中间值的平均值。

同样在percent_rank中,由于我必须找到多列的中位数,所以我必须在不同的数据帧中计算它,这对我来说是一个不太复杂的方法。如果我的理解不正确,请纠正我。

+---+-------------+
|num|percent_rank |
+---+-------------+
|0.0|0.0|
|0.0|0.0|
|1.0|0.4|
|1.0|0.4|
|1.0|0.4|
|1.0|0.4|
+---+---+

出于好奇,您使用的是哪个版本的 Apache Spark? Apache Spark 2.0+ 中进行了一些修复,其中包括对approxQuantile.

如果我要运行下面的 pySpark 代码片段:

rdd = sc.parallelize([[1, 0.0], [1, 0.0], [1, 1.0], [1, 1.0], [1, 1.0], [1, 1.0]])
df = rdd.toDF(['id', 'num'])
df.createOrReplaceTempView("df")

median计算使用approxQuantile as:

df.approxQuantile("num", [0.5], 0.25)

or

spark.sql("select percentile_approx(num, 0.5) from df").show()

结果是:

  • 火花2.0.0: 0.25
  • 火花2.0.1: 1.0
  • 火花2.1.0: 1.0

请注意,因为这些是近似数字(通过approxQuantile)虽然一般来说这应该运作良好。如果您需要精确的中位数,一种方法是使用numpy.median。下面的代码片段已为此更新df基于 gench 的 SO 响应的示例如何使用 Python Dataframe API 在 Apache Spark 中查找中位数?:

from pyspark.sql.types import *
import pyspark.sql.functions as F
import numpy as np

def find_median(values):
    try:
        median = np.median(values) #get the median of values in a list in each row
        return round(float(median),2)
    except Exception:
        return None #if there is anything wrong with the given values

median_finder = F.udf(find_median,FloatType())

df2 = df.groupBy("id").agg(F.collect_list("num").alias("nums"))
df2 = df2.withColumn("median", median_finder("nums"))

# print out
df2.show()

输出为:

+---+--------------------+------+
| id|                nums|median|
+---+--------------------+------+
|  1|[0.0, 0.0, 1.0, 1...|   1.0|
+---+--------------------+------+

更新:使用 RDD 的 Spark 1.6 Scala 版本

如果您使用的是 Spark 1.6,您可以计算median通过 Eugene Zhulenev 的回复使用 Scala 代码如何使用 Apache Spark 计算准确的中位数。下面是适用于我们的示例的修改后的代码。

import org.apache.spark.SparkContext._

  val rdd: RDD[Double] = sc.parallelize(Seq((0.0), (0.0), (1.0), (1.0), (1.0), (1.0)))

  val sorted = rdd.sortBy(identity).zipWithIndex().map {
    case (v, idx) => (idx, v)
  }

  val count = sorted.count()

  val median: Double = if (count % 2 == 0) {
    val l = count / 2 - 1
    val r = l + 1
    (sorted.lookup(l).head + sorted.lookup(r).head).toDouble / 2
  } else sorted.lookup(count / 2).head.toDouble

输出为:

// output
import org.apache.spark.SparkContext._
rdd: org.apache.spark.rdd.RDD[Double] = ParallelCollectionRDD[227] at parallelize at <console>:34
sorted: org.apache.spark.rdd.RDD[(Long, Double)] = MapPartitionsRDD[234] at map at <console>:36
count: Long = 6
median: Double = 1.0

请注意,这是使用以下方法计算精确中位数RDDs- 也就是说,您需要将 DataFrame 列转换为 RDD 才能执行此计算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spark SQL 中查找多个双数据类型列的中位数 的相关文章

随机推荐

  • 如何使用 JQuery 更改 onClick 复选框的值?

    在这里 我尝试在单击以下复选框时更改其值 在下面的代码中 我尝试将复选框的值更改为 1 并在未选中时将值更改为 0 但它只需要 false 条件 当取消选中该复选框时 值会更改为 0 但选中时 它不会更改为 1 有什么建议如何解决此问题吗
  • 如何在 SceneKit 中的“自己”轴上移动旋转的 SCNNode?

    下图显示了一个旋转框 应在 X 轴和 Z 轴上水平移动 Y 应该不受影响 以简化场景 这个盒子也可能是相机的 SCNNode 所以我想此时投影没有意义 假设我们想要沿着红色箭头的方向移动盒子 如何使用 SceneKit 来实现这一点 红色箭
  • 具有 Robocopy 和参数传递的 Powershell

    我正在尝试编写一个使用的脚本robocopy 如果我只是手动执行此操作 我的命令将是 robocopy c hold test1 c hold test2 test txt NJH NJS 但是 当我从 powershell 执行此操作时
  • 如何存储CLLocationCooperative2D?

    我正在尝试构建一个应用程序 该应用程序可以构建和保存类似于绘制我的跑步路线的路线 我正在使用面包屑示例代码 特别是CrumbPath and CrumbPathView作为我路线的基础 来自 Apple 两个问题 如果我尝试访问MKMapP
  • 使用 C# 和 Google.Apis.YouTube.v3 列出 YouTube 视频

    我正在尝试使用最新版本的 Google Apis YouTube v3 截至 2014 年 1 月 15 日 执行一些 YouTube 视频交互 我已经完成了以下内容的 NuGet Google Apis YouTube v3 Google
  • 如何在 Python 中访问私有变量? [复制]

    这个问题在这里已经有答案了 class Car object def init self color engine oil self color color self engine engine self oil oil a Car bla
  • iPhone 的闪存有多少个编程/擦除周期? [关闭]

    Closed 这个问题是无关 目前不接受答案 不确定这是解决这个问题的正确网站 但由于这里有很多聪明人 也许有人知道 我正在构建一个需要连续捕获视频的应用程序 但只保留最后几分钟 比如 5 15 分钟 通过将视频分割为 30 秒的文件并删除
  • 如何仅使用 XPath 和 C# .NET 获取元素内容

    我找到了很多关于如何使用简单的XPath表达式和C 获取节点内容的文章 例如 XPath bookstore author first name C string xpathExpression bookstore author first
  • R 中水平树状图的树切割和簇周围的矩形

    我正在尝试绘制层次聚类的结果R作为树状图 用矩形标识簇 以下代码适用于垂直树状图 但对于水平树状图 horiz TRUE 则不绘制矩形 有什么方法可以对水平树状图做同样的事情吗 library cluster dst lt daisy ir
  • Java 代码 - 字节数组中的负字节到 C#

    在Java中我有以下行 new byte 59 55 79 1 0 64 32 3 但是 在 C 中 我不能在字节数组中使用负字节 我尝试将其转换为字节 但失败了 我能做些什么 谢谢 因为在 C 中字节是unsigned 在Java中 字节
  • Bitvise SH 客户端安装错误。 CreateDirectory() 失败:Windows 错误 5:访问被拒绝

    我正在尝试安装 bit vise ssh 客户端 但它没有安装并抛出异常 捕获异常 Failed to create directory C Program Files x86 Common Files Bitvise CreateDire
  • 更改 R 中 ggplot 中组的顺序

    我在用ggplot绘制条形图 如何更改栏中组的顺序 在下面的示例中 我希望将 type 1984 作为第一堆条形图 然后将 type 1985 放在 1984 的顶部 依此类推 series lt data frame time c rep
  • Python 双向映射

    我不知道该怎样称呼我正在寻找的东西 因此 如果我未能在其他地方找到这个问题 我深表歉意 简而言之 我正在编写将直接与 Linux 内核交互的 python 代码 很容易从包含头文件中获取所需的值并将它们写入我的源代码 IFA UNSPEC
  • 将项目列表转换为树的好且通用的方法

    我有类别列表 Id Name Parent id 1 Sports 0 2 Balls 1 3 Shoes 1 4 Electronics 0 5 Cameras 4 6 Lenses 5 7 Tripod 5
  • PhantomJS 没有使用网络字体渲染屏幕截图?

    所以我一直在四处寻找 似乎找不到如何让 PhantomJS 在屏幕截图上实际显示网页字体的解决方案 有人能告诉我是否有办法做到这一点 我已经测试了大约一周 终于得出了答案 知道这也可能是我在 Windows 机器上运行 PhantomJS
  • 如何在python3中安装COCO PythonAPI

    看来COCO PythonAPI仅支持python2 但人们确实在 python3 环境中使用它 我尝试了可能的方法来安装它 例如 python3 setup py build ext inplace python3 setup py in
  • 是否可以使用jQuery读取meta标签

    是否可以使用 jQuery 读取元标记 如果是这样 您知道代码的基本结构是什么 或者有任何教程的链接 只需使用类似的东西 var author meta name author attr content 或这个也是如此 var author
  • JSF 中的 CSRF、XSS 和 SQL 注入攻击预防

    我有一个基于 JSF 构建的 Web 应用程序 并使用 MySQL 作为数据库 我已经在我的应用程序中实现了防止 CSRF 的代码 现在由于我的底层框架是 JSF 我想我不必处理 XSS 攻击 因为它已经由UIComponent 我没有在任
  • IE7 和 IE8 中的框阴影

    我想在 IE7 和 IE8 中实现框阴影 我已经尝试了一切但没有成功 这是我用来将彩色阴影应用于 div 的 css bright position absolute z index 1 moz box shadow 0px 3px 55p
  • 在 Spark SQL 中查找多个双数据类型列的中位数

    我需要找到多个双数据类型列的中位数 请求建议以找到正确的方法 下面是我的示例数据集 其中有一列 我期望我的样本的中值返回为 1 scala gt sqlContext sql select num from test show num 0