donné une source de données avec champs: i J'essaie de construire la logique pour attraper des enregistrements forts> se chevauchant forts> pour le même produit code> (basé sur je voudrais recevoir en sortie p> car Lorsque les 2 dernières conditions précisent simplement que je ne suis pas intéressé par des cas dans lesquels pour comment Le problème est structuré est facile à penser à une solution avec MapReduce à l'aide de RDD, mais je suis intéressé par une solution indice strong>: Il y a une chance que avec Pour toute explication plus poussée N'hésitez pas à demander p > ne pas dupliquer strong> de Comment agréger sur la fenêtre de temps de roulement avec des groupes dans une étincelle p> malheureusement dans la réponse déclarée a été utilisée produit_id code> -
produit code> -
start_time code> -
end_time code>
start_time code> et
end_time code>) en utilisant les fonctions deataframe. p>
bouteille_1 code> a des temps de chevauchement avec
bouteille_2 code> et
bottle_3 code>, où 2 enregistrements se chevauchent si les conditions suivantes sont remplies: P>
max (a.start_time, b.start_time)
! (A.Start_time == b.start_time && A.end_time == b.end_time) Code> LI>
a.start_time! = b.start_time || a.end_time! = B.end_time Code> Li>
ul>
start_time code> et
end_time code> sont égaux (par exemple,
CAN_1 code> et
can_3 code> ne sont pas dans le résultat attendu même s'ils ont le même
start_time code> et
end_time code>). p>
groupeby (). AGG () code> est possible de spécifier une condition intéressante qui atteint la logique décrite? p>
f.lag code>, lequel Dans mon cas n'est pas assez bon état: F.Lag utilise une comparaison avec l'enregistrement précédent uniquement, mais dans l'exemple signalé ne fonctionnerait pas si désiré depuis que
bouteille_1 code> ne serait pas signalé comme superposé avec < code> bouteille_3 code> car ils ne sont pas des enregistrements consécutifs p> p>
3 Réponses :
Chacune des conditions peut être traduite directement dans SQL
(df.alias("a").join(df.alias("b"), ["product"]).filter(cond1 & cond2 & cond3))
Essayez ceci:
+-----+---+---+------+----+----+ |label|min|max|label1|min1|max1| +-----+---+---+------+----+----+ | 1| 2| 5| 2| 4| 7| | 2| 4| 7| 3| 6| 9| +-----+---+---+------+----+----+
Merci beaucoup! Les deux solutions (votre et @ user11013893) m'ont aidé à résoudre mon problème! Votre solution a où ($ "étiquette" <$ "étiquette1") code> qui m'a aidé à éviter les résultats dupliqués, tandis que les autres ont fourni des fonctions plus intéressantes. Probablement le
crossjoin code> n'était pas nécessaire: une jointure interne normale en fonction du produit
code> (voir l'exemple) était suffisant. Je ne comprends pas pourquoi ma question a été votée (identique pour votre réponse que j'ai votée). Mais je pense que votre réponse était plus utile avec l'utilisation du
où ($ "étiquette" <$ "label1") code>. Je vais accepter le vôtre
Pour aider la lisibilité de la réponse, pourriez-vous modifier votre message et vous rapprocher de l'exemple que j'ai signalé? Donc changer où ($ "étiquette" <$ "étiquette1") code> à
sur
où ($ "product_id" <$ "product_id1") code>, la jointe basée sur
code> ... et ainsi de suite
Je suggère de mettre le code Python dans une réponse séparée car elle modifie complètement le style de programmation.
J'ai commencé à travailler avec ML avec Python, mais c'était trop dynamique pour moi. Scala est parfait (professionnellement, je me développe en Java);>
basé sur @Andiconicus Solution J'ai créé cette approche dans Pure Python.
Il était nécessaire de rejoindre Le tout le code: p> Dataframe code> avec lui-même pour vérifier si des rangées se chevauchent. Bien sûr, vous devez omettre auto-auto avec la condition
df.product_id
rangée code> et le chevauchement de code> produit code> S) . p>