2017-09-20 3 views
0

Mes données ressemblent à:Comment récupérer le premier enregistrement dans une transaction en utilisant scala?

enter image description here

Je veux chercher premier enregistrement de chaque dtcode avec un mini-temps d'occurrences.

sortie souhaitée:

enter image description here

En utilisant scala je veux chercher. Veuillez me guider dans la construction de la logique.

Merci, Syam.

+0

Je suis d'accord avec Jacques Amar ci-dessous, la seule façon que je vois que vous pouvez résoudre ce problème est de boucler manuellement sur l'ensemble dataframe vous et vérifier si le 'dtcode' a changé ou non. Ce devrait être simplement pour faire le programme lui-même, mais ce ne sera pas très efficace. Si vous pouviez obtenir un identifiant unique pour chaque groupe, alors 'groupBy()' serait une alternative facile. – Shaido

Répondre

0

J'ai réfléchi un peu plus à votre problème et ai trouvé une meilleure solution, en utilisant les fonctions Window des données. Tout d'abord tout est ordonné par Currentdatedtime puis chaque ligne est vérifiée pour voir si dtcode a changé ou non. En utilisant votre exemple des données:

val spark = SparkSession.builder.getOrCreate() 
import spark.implicits._ 


val df = Seq(("7-1-2016 0:00:17",0),("7-1-2016 0:01:17",0), 
    ("7-1-2016 0:02:17",4),("7-1-2016 0:03:17",4), 
    ("7-1-2016 0:04:17",0),("7-1-2016 0:05:17",0), 
    ("7-1-2016 0:06:17",0),("7-1-2016 0:07:17",5)).toDF("Currentdatedtime", "dtcode") 

val w = Window.orderBy("Currentdatedtime") 
val df2 = df.withColumn("dtcode_change", 
    when(lag($"dtcode", 1).over(w) === $"dtcode", 0). 
    otherwise(1)) 
.filter($"dtcode_change" === 1) 
.drop("dtcode_change") 

vous donnera:

+----------------+------+ 
|Currentdatedtime|dtcode| 
+----------------+------+ 
|7-1-2016 0:00:17|  0| 
|7-1-2016 0:02:17|  4| 
|7-1-2016 0:04:17|  0| 
|7-1-2016 0:07:17|  5| 
+----------------+------+ 
+0

Merci pour la logique ... – user3631634

+0

@ user3631634 envisagez d'accepter la réponse (en cliquant sur la coche à côté de la réponse)/en la revivant si la réponse vous a aidé. :) – Shaido

0

--- ÉDITÉ avec un commentaire correct de Shaido ---

Habituellement, GROUP BY manipulerais cela, si l'ordre dans la table est irrelevent,

SQL est bon avec regroupement grande quantité de données connexes . Cependant, votre analyse dépend de l'ordre de saisie des données et le changement est déclenché par un changement dans une colonne qui peut être répété plus tard et ne peut pas être agrégé, alors que les autres colonnes peuvent continuer à changer.

Dans ce cas, vous devrez BOUGER sur vos données et détecter les changements manuellement, car SQL n'a pas un moyen facile de regrouper ce genre de choses. J'ai répondu un peu trop vite et je n'avais pas remarqué ça.

Ceci est mieux géré par une procédure stockée ou une langue d'affichage. Je peux vous donner le code en PHP si vous le souhaitez.

Une autre triche sera d'ajouter une colonne qui est utilisée par GROUP BY (appelons-le groubycheat) qui augmente chaque fois que dtcode change

SELECT MIN(Currentdatedtime) as Currentdatedtime, dtcode 
FROM <tablename> 
GROUP BY groupbycheat; 

Cela nécessite encore une boucle pour ajouter le champ, mais si vous devez obtenir les résultats plusieurs fois, alors ça vaut le coup. Sinon ..no

+0

groupBy ne fonctionnera pas ici car 'dtcode' n'est pas unique pour chaque groupe. Vérifiez l'exemple donné à nouveau, il y a deux groupes avec 0. – Shaido

+0

Merci pour la réponse shaido .. Je ne veux ni SQL ni Scala Je ne connais pas le PHP. Ces données doivent être extraites du système HDFS. – user3631634