计算spark中数字列的第一个四分位数

时间:2014-06-23 23:54:49

标签: scala apache-spark

我是火花/斯卡拉的新手。这就是我在计算csv文件的第一个四分位数时所做的事情

val column= sc.textFile("test.txt").map(_.split(",")(2)).flatMap(_.split(",")).map((_.toDouble))
val total = column.count.toDouble
val upper=(total+1)/4
val upper2= scala.math.ceil(upper).toInt

除了添加键值对之外,我还不确定如何对列进行排序。 我需要的是在四分位数排序之后取最后两个值。但是,我被迫创建一个关键值对。

val quartiles = column.map((_,1)).sortByKey(true).take(upper2)
val first_quartile =0
if(upper % upper.toInt >0){
   first_quartile = quartiles(upper.toInt-1) 
}else{
   first_quartile = (quartiles(upper2-1) +(quartiles(upper2-2))/2
}

这样可行,但它会给我带来烦人的键值对。我如何恢复到只有1列而不是2列(例如键值对)

1 个答案:

答案 0 :(得分:8)

我自己就是这样做的。我开始编写一个函数来计算中位数,但发现通过将我的RDD作为DataFrame转换并使用SQL查询它来获得分位数更快更容易。这是一个独立的例子:

  // construct example RDD
  val rows = Seq(3, 1, 5, 1, 9, 2, 2)
  val rdd = sc.parallelize(rows)

  // construct Dataframe
  case class MedianDF(value: Long)
  val df = rdd.map(row => MedianDF(row.toLong)).toDF 

  // register the table and then query for your desired percentile
  df.registerTempTable("table")
  sqlContext.sql("SELECT PERCENTILE(value, 0.5) FROM table").show()

返回2,中位数。同样,如果你想第一个四分位只是将0.25传递给PERCENTILE:

sqlContext.sql("SELECT PERCENTILE(value, 0.25) FROM table").show()