2016-11-14 12 views
0

でMAX(日付)によってどのように選択するか、次のデータセットスパークデータフレームAPI

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] 

は(...、もっと慣用)より良い方法はありますか?

ボーナス:日付列でmaxを実行し、このエラーを回避する方法Aggregation function can only be applied on a numeric column.

+0

をフィールド。 – Shankar

+0

私はこれが動作するかどうかはわかりませんが、SQLを試してみる価値はあります:select max(date)as mdate、id by tmp_table group from id; – evgenii

答えて

0

あなたは、MAX関数とagg()を試すことができます。

import static org.apache.spark.sql.functions.* df.groupBy("id").agg(max("date"))

0

私にとってはそれだけでtaht道働いていた:あなたは日に `agg`を適用するには、` from_unixtime`機能を試すことができます

df = df.groupBy('CPF').agg({'DATA': 'max'}) 
関連する問題