我是火花/斯卡拉的新手。这就是我在计算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列(例如键值对)
答案 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()