提供以下代码
case class Contact(name: String, phone: String)
case class Person(name: String, ts:Long, contacts: Seq[Contact])
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
import sqlContext.implicits._
val people = sqlContext.read.format("orc").load("people")
按时间戳重复数据删除用户的最佳方法是什么 那么max ts的用户会留在收藏中吗? 在使用RDD的spark中,我会运行类似这样的东西
rdd.reduceByKey(_ maxTS _)
并将maxTS方法添加到Person或添加含义......
def maxTS(that: Person):Person =
that.ts > ts match {
case true => that
case false => this
}
是否可以在DataFrames上执行相同的操作?这会是类似的表现吗? 我们正在使用spark 1.6
答案 0 :(得分:2)
你可以使用Window函数,我假设密钥是name
:
import org.apache.spark.sql.functions.{rowNumber, max, broadcast}
import org.apache.spark.sql.expressions.Window
val df = // convert to DataFrame
val win = Window.partitionBy('name).orderBy('ts.desc)
df.withColumn("personRank", rowNumber.over(win))
.where('personRank === 1).drop("personRank")
对于每个人,它将创建personRank - 每个具有给定名称的人将具有唯一编号,具有最新ts的人将具有最低等级,等于1.您放弃临时等级
答案 1 :(得分:0)
你可以做一个groupBy并使用你最喜欢的aggragation方法,如sum,max等。
df.groupBy($"name").agg(sum($"tx").alias("maxTS"))
答案 2 :(得分:0)
您是否可以通过调用Dataframe.rdd来完成您的工作?