首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Hive的直方图中使用固定柱状图大小?

如何在Hive的直方图中使用固定柱状图大小?
EN

Stack Overflow用户
提问于 2015-11-19 03:16:04
回答 1查看 1.6K关注 0票数 1

我使用的是火花MLLib k-Means,它要求特征具有相同的尺寸。这些特征是使用直方图计算的,所以我必须使用固定大小的柱状图。Hive有一个内置函数histogram_numeric(col,b) -使用b个非均匀间隔的柱状图计算组中数值列的直方图。在直方图中最好的方法是什么?如何使用b个固定大小的柱状图?

EN

回答 1

Stack Overflow用户

发布于 2015-11-19 04:00:19

处理此问题的一种可能方法是创建一个UDF,如下所示

代码语言:javascript
运行
复制
import org.apache.spark.sql.Row
import org.apache.spark.sql.functions._

def get_bucket(breaks: Array[Double]) = udf(
  (x: Double) =>
     scala.math.abs(java.util.Arrays.binarySearch(breaks, x) + 1))

让我们假设您的数据如下所示:

代码语言:javascript
运行
复制
val df = sc.parallelize(Seq(
  (1, 1.0), (1, 2.3), (1, 0.4), (1, 2.1), (1, 3.5), (1, 9.0),
  (2, 3.6), (2, 0.2), (2, 0.6), (2, 0.1), (2, 4.0), (2, -1.0)
)).toDF("k", "v")

其中k标识点,v是要用来计算直方图的值。

代码语言:javascript
运行
复制
val breaks = Array(0.0, 1.0, 2.0, 3.0, 4.0)

val dfWithBuckets = df
  .withColumn("bucket", get_bucket(breaks)($"v"))
  .groupBy($"k", $"bucket")
  .agg(count(lit(1)))

dfWithBuckets.show()
// +---+------+--------+
// |  k|bucket|count(1)|
// +---+------+--------+
// |  1|     1|       1|
// |  1|     2|       1|
// |  1|     3|       2|
// |  1|     4|       1|
// |  1|     5|       1|
// |  2|     0|       1|
// |  2|     1|       3|
// |  2|     4|       1|
// |  2|     5|       1|
// +---+------+--------+

最后,上述数据可以被收集、分组并转换为向量:

代码语言:javascript
运行
复制
import org.apache.spark.mllib.linalg.Vectors

def toVector(xs: Iterable[(Int, Long)], n: Int) = {
    val sorted = xs.toArray.sorted
    val indices = sorted.map(_._1)
    val values = sorted.map(_._2.toDouble)
    Vectors.sparse(n, indices, values)
}

val vectors = dfWithBuckets.map{
  case Row(k: Int, b: Int, cnt: Long) =>
    (k, (b, cnt))}
  .groupByKey
  .mapValues(vs => toVector(vs, breaks.size + 1))

vectors.collect
// Array[(Int, org.apache.spark.mllib.linalg.Vector)] = Array(
//   (1,(6,[1,2,3,4,5],[1.0,1.0,2.0,1.0,1.0])),
//   (2,(6,[0,1,4,5],[1.0,3.0,1.0,1.0])))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33788455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档