Scala 计算spark中数字列的第一个四分位数
我是spark/scala的新手。这就是我计算csv文件的第一个四分位数所做的Scala 计算spark中数字列的第一个四分位数,scala,apache-spark,Scala,Apache Spark,我是spark/scala的新手。这就是我计算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 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列(例如键值对)我只是自己做的。我开始编写一个函数来计算中间值,但发现通过将RDD转换为数据帧并使用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到百分位数:
sqlContext.sql("SELECT PERCENTILE(value, 0.25) FROM table").show()
您可以通过
rdd.keys
丢弃虚拟值。是否有使用Spark的理由/要求?不是真正的要求,只是开始学习Spark和scala。太快了DHi Eric,您使用的是什么版本的spark?您使用的是什么sql上下文?是spark sqlcontext还是hive sqlcontext?您也可以共享导入语句吗