Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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_Dataframe - Fatal编程技术网

Scala 关于Spark数据帧操作的问题

Scala 关于Spark数据帧操作的问题,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,如果我创建这样的数据帧: val df1 = sc.parallelize(List((1, 1), (1, 1), (1, 1), (1, 2), (1, 2), (1, 3), (2, 1), (2, 2), (2, 2), (2, 3)).toDF("key1","key2") 然后我按“键1”和“键2”分组,并计算“键2” 我的问题是如何过滤这个数据帧并保留每个“key1”中“k”的前2个数字 如果我不使用窗口函数,我应该如何解决这个问题?可以使用窗口函数,使用行数()(或者秩()/

如果我创建这样的数据帧:

val df1 = sc.parallelize(List((1, 1), (1, 1), (1, 1), (1, 2), (1, 2), (1, 3), (2, 1), (2, 2), (2, 2), (2, 3)).toDF("key1","key2")
然后我按“键1”和“键2”分组,并计算“键2”

我的问题是如何过滤这个数据帧并保留每个“key1”中“k”的前2个数字



如果我不使用窗口函数,我应该如何解决这个问题?

可以使用窗口函数,使用
行数()
(或者
秩()
/
密集秩()
,具体取决于您的要求):


它通知:错误ApplicationMaster:用户类引发异常:org.apache.spark.sql.AnalysisException:无法解析窗口函数“row\u number”。请注意,使用窗口函数当前需要HiveContext;如何解决这个问题?谢谢!!我的spark版本是1。6@RyanWang如错误所示,您需要创建一个
HiveContext
,而不是
SQLContext
sufficient@RyanWang我添加了一个没有窗口函数的解决方案
val df2 = df1.groupBy("key1","key2").agg(count("key2") as "k").sort(col("k").desc)
import org.apache.spark.sql.functions.row_number
import org.apache.spark.sql.expressions.Window

df2
  .withColumn("rnb", row_number().over(Window.partitionBy($"key1").orderBy($"k".desc)))
  .where($"rnb" <= 2).drop($"rnb")
  .show()
df2
  .rdd
  .groupBy(_.getAs[Int]("key1"))
  .flatMap{case (_,rows) => {
    rows.toSeq
      .sortBy(_.getAs[Long]("k")).reverse
      .take(2)
      .map{case Row(key1:Int,key2:Int,k:Long) => (key1,key2,k)}
   }
 }
.toDF("key1","key2","k")
.show()