Apache spark 如何使用spark dataframe API按最大值(日期)进行选择

Apache spark 如何使用spark dataframe API按最大值(日期)进行选择,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,给定以下数据集 id v date 1 a1 1 1 a2 2 2 b1 3 2 b2 4 我只想为每个id选择最后一个值(关于日期) 我想出了以下代码: scala> val df = sc.parallelize(List((41,"a1",1), (1, "a2", 2), (2, "b1", 3), (2, "b2", 4))).toDF("id", "v", "date") df: org.apache.spark.sql.DataFrame = [id: int,

给定以下数据集

id v  date
1  a1 1
1  a2 2
2  b1 3
2  b2 4
我只想为每个id选择最后一个值(关于日期)

我想出了以下代码:

scala> val df = sc.parallelize(List((41,"a1",1), (1, "a2", 2), (2, "b1", 3), (2, "b2", 4))).toDF("id", "v", "date")
df: org.apache.spark.sql.DataFrame = [id: int, v: string, date: int]

scala> val agg = df.groupBy("id").max("date")
agg: org.apache.spark.sql.DataFrame = [id: int, max(date): int]

scala> val res = df.join(agg, df("id") === agg("id") && df("date") === agg("max(date)"))
16/11/14 22:25:01 WARN sql.Column: Constructing trivially true equals predicate, 'id#3 = id#3'. Perhaps you need to use aliases.
res: org.apache.spark.sql.DataFrame = [id: int, v: string, date: int, id: int, max(date): int]
有没有更好的方法(更地道的…)

奖励:如何对日期列执行最大值并避免此错误
聚合函数只能应用于数字列。

您可以使用最大值函数尝试
agg()

导入静态org.apache.spark.sql.functions*

df.groupBy(“id”).agg(max(“date”))

对我来说,它只能以以下方式工作:

df = df.groupBy('CPF').agg({'DATA': 'max'})

您可以尝试从_unixtime函数中使用
来在日期字段中应用
agg
。我不确定这是否有效,但值得尝试SQL:按id从tmp_表组中选择最大(日期)作为mdate,id;