DataFrames中与reduceByKey类似的替代方法是什么?

时间:2017-03-22 10:09:03

标签: scala apache-spark spark-dataframe

提供以下代码

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

3 个答案:

答案 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来完成您的工作?