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()