当前位置: 首页 > 知识库问答 >
问题:

如何将数据聚合到范围(存储桶大小)中?

尉迟兴修
2023-03-14

我有一张桌子,比如

+---------------+------+
|id             | value|
+---------------+------+
|               1|118.0|
|               2|109.0|
|               3|113.0|
|               4| 82.0|
|               5| 60.0|
|               6|111.0|
|               7|107.0|
|               8| 84.0|
|               9| 91.0|
|              10|118.0|
+---------------+------+

as 希望将值聚合或将值条柱到 0,10,20,30,40 的范围内,...80,90,100,110,120如何在SQL或更具体的spark sql中执行此操作?

目前我有一个侧视图,但这看起来相当笨拙/低效。

分位数离散化并不是我真正想要的,而是这个范围的CUT

https://github.com/collectivemedia/spark-ext/blob/master/sparkext-mllib/src/main/scala/org/apache/spark/ml/feature/Binning.scala 将执行动态条柱,但我宁愿需要这个指定的范围。

共有2个答案

西门伟
2023-03-14

尝试使用此“分组依据”

SELECT id, (value DIV 10)*10 FROM table_name ;

以下将使用Scala的数据集API:

df.select(('value divide 10).cast("int")*10)
华季萌
2023-03-14

一般情况下,可以使用org . Apache . spark . ml . feature . bucket izer执行静态宁滨:

val df = Seq(
  (1, 118.0), (2, 109.0), (3, 113.0), (4, 82.0), (5, 60.0),
  (6, 111.0), (7, 107.0), (8,  84.0), (9, 91.0), (10, 118.0)
).toDF("id", "value")

val splits = (0 to 12).map(_ * 10.0).toArray

import org.apache.spark.ml.feature.Bucketizer
val bucketizer = new Bucketizer()
  .setInputCol("value")
  .setOutputCol("bucket")
  .setSplits(splits)

val bucketed = bucketizer.transform(df)

val solution = bucketed.groupBy($"bucket").agg(count($"id") as "count")

结果:

scala> solution.show
+------+-----+
|bucket|count|
+------+-----+
|   8.0|    2|
|  11.0|    4|
|  10.0|    2|
|   6.0|    1|
|   9.0|    1|
+------+-----+

当值位于定义的箱之外时,桶化器会抛出错误。可以将分割点定义为Double.NegativeInfinityDouble.PositiveInfinity来捕获异常值。

<code>Bucketizer</code>设计用于通过执行右bucket的二进制搜索来有效地处理任意拆分。对于像您这样的普通垃圾箱,您可以简单地执行以下操作:

val binned = df.withColumn("bucket", (($"value" - bin_min) / bin_width) cast "int")

其中< code>bin_min和< code>bin_width分别是最小bin的左区间和bin宽度。

 类似资料:
  • 问题内容: 我从elasticsearch开始,并且一直试图进行一些聚合。基本上,我有一个数据集,包含以下形式的数据: 现在,我想进行一些汇总,并在一个查询中获得所有的Continental餐馆,Good餐馆,New York餐馆。 请注意,我不希望统计所有类型的餐厅,而只希望统计特定类型的餐厅。而且,这些聚合是相互独立的。就是说,当我说“好”时,我并不一定要它是“大陆”,它可以是意大利语或其他任

  • 问题内容: ES版本:1.5(Amazon Elasticsearch) 我的目标:在某个字段上具有重复数据删除功能的搜索结果。我目前正在对聚合进行一些研究,以解决重复数据删除问题。因此,我的结果是一个带有1个大小的存储桶的列表存储桶。但是,我找不到订购存储桶列表的方法。 当前查询: 结果: 我想看到第二个存储桶,其中max_score = 68.78424为第一个。这可能吗? 如果不建议使用聚合

  • 此处为elasticsearch新用户,但存在术语聚合问题。我为187份文档编制了索引,其中包含“名称”、“主机”、“风险”等字段。字段风险有4个唯一值(“关键”、“高”、“中”、“低”、“信息”),我正在运行这样的术语聚合: 我希望得到一个结果,说明我有x个临界值,x个高值等等。问题是,我没有得到返回的桶。 我的Elasticsearch版本是7.12.0有什么想法吗 > 编辑:这是映射: 以下

  • 问题内容: 我需要计算管道聚合返回的结果集中的存储桶数。问题是我的查询在这里使用脚本选择器: 返回类似这样的内容: 在该键下,我可以看到一个满足我条件的访问者列表(由标识的每个访问者都必须在索引中恰好有三个文档),但这不是很有用,因为它可以处理成千上万的访问者。我正在使用PHP处理结果,从理论上讲,它可以计算结果集,但是对于大量的访问者来说,这并不是最好的主意。有没有一种方法可以仅在和旁边输出有效

  • 亚马逊是否提供了一种简单的方法来查看我的S3存储桶或文件夹使用了多少存储空间?这是为了我可以计算我的成本等。

  • 问题内容: 我有很多不同提供商的IP范围。例如 我将此IP转换为int32: 我的任务: 通过用户IP地址查找提供者名称(例如192.168.2.20(3232236052)) 在MySQL中很简单: Redis怎么做? 问题答案: 这取决于您是否认为您的IP范围可以重叠。如果不是,则解决方案非常简单: 使用哈希的集合来存储提供者数据 使用zset索引范围的最大值 检索最大值大于IP的(唯一)范围