2017-04-01 28 views
0

我是Spark/Scala世界的新手,我對從數據框中選擇數據有疑問。 我有一個表與下面的數據,我需要選擇每個卡斯特USER_ID對,所有的最後修改的記錄,用最大MODIFY_TIME如何從數據框中爲一對密鑰選擇最近的數據?

原始數據幀:

+--------+----------+------------+--------------------+ 
| cust | user_id | another_id |  modify_time | 
+--------+----------+------------+--------------------+ 
| cust1| 1  |   222|2017-03-22 07:29 | 
| cust1| 1  |   111|2017-03-22 07:29 | 
| cust2| 2  |   111|2017-03-21 07:29 | 
| cust1| 1  |   333|2017-03-21 07:29 | 
| cust2| 2  |   444|2017-03-22 07:29 | 
| cust2| 2  |   333|2017-03-22 07:29 | 
+--------+----------+------------+--------------------+ 

所需的結果:

+--------+----------+------------+--------------------+ 
| cust | user_id | another_id |  modify_time | 
+--------+----------+------------+--------------------+ 
| cust1| 1  |   222|2017-03-22 07:29 | 
| cust1| 1  |   111|2017-03-22 07:29 | 
| cust2| 2  |   444|2017-03-22 07:29 | 
| cust2| 2  |   333|2017-03-22 07:29 | 
+--------+----------+------------+--------------------+ 

什麼是最有效的方式來做到這一點?

回答

0

我做了以下內容和它給了我預期的結果:

val custUserModifyTime = df 
     .groupBy($"cust", $"user_id").agg(max($"modify_time")).collect() 

val mostRecent: Seq[DataFrame] = custUserModifyTime.map(x => df.select("*") 
     .where("cust = '" + x.getAs[String]("cust") + "'" + 
     " AND user_id = '" + x.getAs[String]("user_id") + "'" + 
     " AND modify_time = '" + x.getAs[Timestamp]("max(modify_time)") + "'")) 

val unifiedMostUpdatedData = mostRecent.reduce((a, b) => a.union(b)) 
相關問題