Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 计算spark中数字列的第一个四分位数_Scala_Apache Spark - Fatal编程技术网

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

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 除了添加键值对之外,我不确定如

我是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 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?您也可以共享导入语句吗