2017-10-06 14 views
0

J'ai une image. J'ai besoin du dernier enregistrement de table sur les bases de updateTableTimestamp pour chaque ID. df.show()Comment sélectionner un enregistrement distinct d'une donnée avec le dernier horodatage

+--------------------+-----+-----+--------------------+ 
|   Description| Name| id |updateTableTimestamp| 
+--------------------+-----+-----+--------------------+ 
|     | 042F|64185|  1507306990753| 
|     | 042F|64185|  1507306990759| 
|Testing    |042MF| 941|  1507306990753| 
|     | 058F| 8770|  1507306990753| 
|Testing 3   |083MF|31663|  1507306990759| 
|Testing 2   |083MF|31663|  1507306990753| 
+--------------------+-----+-----+--------------------+ 

besoin de la sortie

+--------------------+-----+-----+--------------------+ 
|   Description| Name| id |updateTableTimestamp| 
+--------------------+-----+-----+--------------------+ 
|     | 042F|64185|  1507306990759| 
|Testing    |042MF| 941|  1507306990753| 
|     | 058F| 8770|  1507306990753| 
|Testing 3   |083MF|31663|  1507306990759| 
+--------------------+-----+-----+--------------------+ 

J'ai essayé

sqlContext.sql("SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY Id ORDER BY updateTableTimestamp DESC) rank from temptable) tmp where rank = 1") 

lui donne erreur sur la partition. Exception dans le thread "principal" java.lang.RuntimeException: [1.29] failure: ``union'' expected but (» found`I me sers étincelle 1.6.2

+1

"il donne une erreur" - quelle est l'erreur? – FuzzyTree

+1

Essayez 'où tmp.rank = 1' ou essayez d'utiliser un alias différent de' rank', puisqu'il s'agit d'un mot réservé. – Simon

+0

PARTITION non prise en charge – lucy

Répondre

0
import org.apache.spark.sql.functions.first 
import org.apache.spark.sql.functions.desc 
import org.apache.spark.sql.functions.col 

val dfOrder = df.orderBy(col("id"), col("updateTableTimestamp").desc) 

val dfMax = dfOrder.groupBy(col("id")). 
      agg(first("description").as("description"), 
       first("name").as("name"), 
       first("updateTableTimestamp").as("updateTableTimestamp")) 
     dfMax.show 

enter image description here

Après cela, si vous voulez réordonner vos champs, il suffit d'appliquer une sele ct fonction à votre nouveau DF.

+0

Excellent! Erik Barajas Merci – lucy

0

Sélectionnez description, le nom, id, updateTableTimestamp De nom_table Où id dans (Select du groupe nom_table par updateTableTimestamp) par ordre updateTableTimestamp desc;