J'ai une table avec 3 colonnes: une date, une carte d'identité et une clé. J'espère trouver un moyen efficace de résumer les instances paire-sage des touches dans un identifiant, puis combinez-vous avec des totaux entre autres ID. Essentiellement construire une liste de transitions temporelles. Par exemple:
entrée: p> sortie: p> IT serait trivialement simple à commander par ID , puis la date à travers et construire des comptes, mais j'espérais que l'un de vous que l'un de vous GURUS pourrait être capable de me résoudre à être plus parallélélisé / efficace. P> Fondamentalement, depuis la commande par date, je J'essaie de capturer le nombre de transitions dans le temps entre les clés. Donc, pour id = a, nous avons xy, alors nous avons gt (donc incrément xy-> gt par 1). Ensuite, nous avons suivi de nous (donc incrément gt-> po avant 1). P> Travailler sur Scala / Python. P> P>
3 Réponses :
Voici une solution potentielle nécessitant seulement 3 lignes:
df['key_lag'] = df.Key.shift(-1) df['key_pairs'] = df.Key + ' ' + df.key_lag print(df.groupby('key_pairs').size()) key_pairs GT WE 1 PO XY 1 WE PO 1 XY GT 2 dtype: int64
Cette boucle semble être exactement ce que je pensais comme la solution "simple". Malheureusement, je pense que je ne serais pas vraiment parallèle dans un sens significatif, non?
Vous avez raison. Cependant, je pensais juste à un moyen de le faire. Je vais éditer ma réponse momentanément.
Voici une solution dans Scala à l'aide de Lag (Clé, 1) Code> Pour associer les touches précédentes / actuelles pour le nombre de paires de clé:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
import spark.implicits._
val df = Seq(
("1/1/2018", "A", "XY"),
("1/2/2018", "A", "GT"),
("1/6/2018", "A", "WE"),
("1/9/2018", "A", "PO"),
("1/2/2018", "B", "XY"),
("1/4/2018", "B", "GT")
).toDF("Date", "ID", "Key")
val win = Window.partitionBy("ID").orderBy("Date", "Key")
df.
withColumn("Date", to_date($"Date", "M/d/yyyy")).
withColumn("FirstKey", lag($"Key", 1).over(win)).
groupBy($"FirstKey", $"Key".as("SecondKey")).agg(count("*").as("Count")).
where($"firstKey".isNotNull).
show
// +--------+---------+-----+
// |FirstKey|SecondKey|Count|
// +--------+---------+-----+
// | WE| PO| 1|
// | GT| WE| 1|
// | XY| GT| 2|
// +--------+---------+-----+
Vous pouvez ajouter une nouvelle colonne indiquant la touche code> suivante code> pour chaque Ceci suppose que la date ID code> commandé par
Date code> en utilisant
pyspark.sql.function.lead code>
. Ensuite, groupe par le premier code> et
secondse code> et
compte code>
: Code> Colonne est un
DateType code> de sorte qu'il puisse être commandé de manière appropriée. Si c'est une chaîne, vous devrez le convertir en une date ou La commande se produira lexicographiquement. p> p>
Pourquoi n'avez-vous besoin que 3 des 6 combinaisons possibles pour id = a?
@Vamsiprabhala je ne suis pas sûr de comprendre? J'aurais probablement pu mieux former. Fondamentalement, depuis ordonné par date, j'essaie de capturer le nombre de transitions à temps entre les clés. Donc, pour id = a, nous avons xy, alors nous avons gt (donc incrément xy-> gt par 1). Ensuite, nous avons suivi par nous (donc incrément gt-> po avant 1). Est-ce que cela clarifie?