Die Berechnung der Kosinus-ähnlichkeit zwischen allen Zeilen des dataframe in pyspark
Ich habe einen Datensatz mit Arbeiter mit Ihrer demographischen Daten wie Alter, Geschlecht,Anschrift usw.-und Ihrem Arbeitsort. Ich habe eine RDD aus dem dataset-Objekt und konvertiert es in ein DataFrame.
Gibt es mehrere Einträge für jede ID. Also, ich habe ein DataFrame die enthalten nur die ID der Arbeiter und die verschiedenen Büro-Standorte", dass er/Sie gearbeitet hatte.
|---------- | ----------------|
| **ID** **Office_Loc** |
|---------- | ----------------|
| 1 |Delhi, Mumbai, |
| | Gandhinagar |
|---------------------------|
| 2 | Delhi, Mandi |
|---------------------------|
| 3 |Hyderbad, Jaipur|
-----------------------------
Möchte ich berechne die Kosinus-ähnlichkeit zwischen jeder Arbeitnehmer mit jedem anderen Arbeitnehmer, basierend auf Ihrer office-Standorte".
So, ich iteriert über die Zeilen des DataFrame, empfangen einer einzelnen Zeile aus der DataFrame :
myIndex = 1
values = (ID_place_df.rdd.zipWithIndex()
.filter(lambda ((l, v), i): i == myIndex)
.map(lambda ((l,v), i): (l, v))
.collect())
und dann mit Karte
cos_weight = ID_place_df.select("ID","office_location").rdd\
.map(lambda x: get_cosine(values,x[0],x[1]))
berechnet den Kosinus-ähnlichkeit zwischen der extrahierten Zeile und das ganze DataFrame.
Ich glaube nicht, dass mein Ansatz ist ein guter, da bin ich zu iterieren durch die Zeilen des DataFrame, es Niederlagen der ganze Zweck der Verwendung von spark.
Gibt es einen besseren Weg, es zu tun in pyspark?
Freundlich beraten.
- Ich thibk es eine etwas lange Frage. In der Regel ist es eine gute Praxis, um Fragen der Aufgabe mit den einfachsten Fall, das Sie immer das gleiche Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die
mllib
- Paket zum berechnen derL2
norm des TF-IDF jeder Zeile. Dann multiplizieren Sie die Tabelle mit sich selbst, um die Kosinus-ähnlichkeit als das Skalarprodukt von zwei durch zweiL2
Normen:1. RDD
Berechnen
TF-IDF
:Können Sie die Anzahl der features in
HashingTF
um die Funktion matrix kleiner (weniger Spalten).Berechnen
L2
norm:Berechnen Kosinus-ähnlichkeit durch die Multiplikation der matrix mit sich selbst:
ODER: Mit einem kartesischen Produkt und die Funktion
dot
auf numpy arrays:2. DataFrame
Da Sie zu sein scheinen mit dataframes, die Sie verwenden können, die
spark ml
Paket statt:Berechnen Sie TF-IDF:
Berechnen
L2
norm:Berechnen Sie matrix-Produkt:
ODER: mit einem join und einer
UDF
für die Funktiondot
:Diesem tutorial listet die verschiedenen Methoden zu multiplizieren großen Maßstab Matrizen: https://labs.yodas.com/large-scale-matrix-multiplication-with-pyspark-or-how-to-match-two-large-datasets-of-company-1be4b1b2871e
requirement failed: The input column must be ArrayType, but got StringType.'
. während der hashingTF transformation während der Verwendung von dataframe.df
data.cartesian(data)\ .map(lambda l: ((l[0][0], l[1][0]), l[0][1].dot(l[1][1])))\ .sortByKey()\ .take(5)
. aber wenn ich mit der mllib code und konvertieren Sie die blockMatrix eine LocalMatrix, es gibt miru'requirement failed: The length of the values array must be less than Int.MaxValue. Currently numRows * numCols: 1006095879729669481'
was ich nicht verstehe, wie ich nehme eine kleine Teilmenge der Daten (über 10 ID ' s), so dass die numRows * numCols:100.numFeatures
um die Anzahl der verschiedenen Städte, die Sie in Ihrem dataframe, standardmäßig ist es262144
werden die Anzahl der Spalten in der block-matrix (ich habe es auf 10 für die sample-Daten, die Sie zur Verfügung gestellt). eincartesian join
mit einemdot product
auch funktioniert. Schauen Sie sich den link, der für große matrix-MultiplikationhashingTF = HashingTF(numFeatures=20,inputCol="Business", outputCol="tf")
. aber der Block-matrix hat immer noch 1003043309L cols und rows. Aber für das kleine Beispiel, dass in der Frage, die ich donot haben das problemresult=data.cartesian(data)\ .map(lambda l: ((l[0][0]), (l[1][0]), l[0][1].dot(l[1][1])))\ .toDF()
bekomme ich die folgende Fehlermeldung nicht unterstützt-Typ: " < " type 'numpy.float64'>`. Wenn ich versuchen ein kleines Beispiel für 10 Einträge, die ich nicht bekomme diese Fehlermeldungnumpy int or float
sind nicht unterstützte Datentypen inpyspark
. Spark ML-Bibliothek basiert aufnumpy arrays
dies ist der Grund, warum konvertieren Sienumpy floats
. Sie können dies umgehen, indem man es alsfloat
. Ich habe das kartesische Produkt Teil für beide RDD und dataframes