2016-07-26 1 views
0

J'ai une table Hive avec les numéros de compte et les dates mises à jour les plus récentes. Tous les comptes ne sont pas mis à jour chaque jour, donc je ne peux pas simplement sélectionner tous les enregistrements d'un certain jour. Je dois regrouper par numéro de compte et ensuite trier dans l'ordre décroissant de prendre les 2 derniers jours pour chaque compte. Mon script jusqu'à présent:Trier par ordre décroissant, en utilisant la table hive dans spark scala

sc.setLogLevel("ERROR") 
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 
import org.apache.spark.sql.functions._ 
import sqlContext.implicits._ 
val df1 = sqlContext.sql("FROM mydb.mytable SELECT account_num, last_updated") 
val DFGrouped = df1.groupBy("account_num").orderBy(desc("data_dt")) 

Je reçois l'erreur sur le orderBy:

value orderBy is not a member of org.apache.spark.sql.GroupedData 

Toute idée sur ce que je devrais faire ici?

+0

On dirait que vous voulez commander les éléments dans les sous-groupes. Si oui, vous pouvez essayer quelque chose comme: 'groupBy (...). Map (_. OrderBy (...))' – jwvh

+0

@jwh Cela ne fonctionnera pas. 'groupBy' est juste une opération logique. – zero323

Répondre

1

Le regroupement ne fonctionnera pas ici car il s'agit d'une forme du problème top N by group.

Vous devez utiliser Spark SQL window functions, en particulier, le rang() avec la partition par ID de compte et par ordre chronologique décroissant, puis en sélectionnant les lignes avec rang < = 2.