Ich habe eine Dataset-Struktur in Spark mit zwei Spalten, eine mit dem Namen user
die andere category
genannt. So dass die Tabelle etwas wie folgt aussieht:Versuch, eindeutige Benutzer zwischen zwei Kategorien in Spark zu zählen
+---------------+---------------+
| user| category|
+---------------+---------------+
| garrett| syncopy|
| garrison| musictheory|
| marta| sheetmusic|
| garrett| orchestration|
| harold| chopin|
| marta| russianmusic|
| niko| piano|
| james| sheetmusic|
| manny| violin|
| charles| gershwin|
| dawson| cello|
| bob| cello|
| george| cello|
| george| americanmusic|
| bob| personalcompos|
| george| sheetmusic|
| fred| sheetmusic|
| bob| sheetmusic|
| garrison| sheetmusic|
| george| musictheory|
+---------------+---------------+
only showing top 20 rows
Jede Zeile in der Tabelle ist einzigartig, aber ein Benutzer und eine Kategorie können mehrmals vorkommen. Ziel ist es, die Anzahl der Benutzer zu zählen, die zwei Kategorien teilen. Zum Beispiel cello
und americanmusic
teilen einen Benutzer mit dem Namen george
und musictheory
und sheetmusic
teilen Benutzer george
und garrison
. Das Ziel besteht darin, die Anzahl der verschiedenen Benutzer zwischen n Kategorien zu ermitteln, was bedeutet, dass es höchstens n Quadratkanten zwischen den Kategorien gibt. Ich verstehe teilweise, wie man diese Operation durchführt, aber ich habe ein wenig Mühe, meine Gedanken zu Spark Java zu konvertieren.
Mein Denken ist, dass ich brauche eine Selbstverknüpfung auf user
zu tun, um einen Tisch zu bekommen, die wie folgt strukturiert sein würde:
+---------------+---------------+---------------+
| user| category| category|
+---------------+---------------+---------------+
| garrison| musictheory| sheetmusic|
| george| musictheory| sheetmusic|
| garrison| musictheory| musictheory|
| george| musictheory| musicthoery|
| garrison| sheetmusic| musictheory|
| george| sheetmusic| musictheory|
+---------------+---------------+---------------+
Die Selbst Betrieb in Funken (Java-Code) beizutreten, ist nicht schwer:
Dataset<Row> newDataset = allUsersToCategories.join(allUsersToCategories, "users");
Dies wird immer irgendwo, aber ich Mappings auf die gleiche Kategorie wie in den Zeilen 3 und 4 in dem obigen Beispiel erhalten und ich rückwärts Mappings, wo die Kategorien so umgekehrt werden, dass im wesentlichen das doppelte jeder Interaktion mit dem Benutzer wie Zählen in den Reihen 5 und 6 von th Das obige Beispiel.
Was ich glaube, dass ich tun muss, ist eine Art von bedingten in meiner Verbindung, die etwas in Richtung X < Y
sagt, so dass gleiche Kategorien und Duplikate weggeworfen werden. Schließlich muss ich dann die Anzahl der einzelnen Zeilen für n-Quadratt-Kombinationen zählen, wobei n die Anzahl der Kategorien ist.
Könnte jemand bitte erklären, wie man das in Spark und speziell in Spark Java macht, da ich mit der Scala-Syntax ein wenig nicht vertraut bin?
Danke für die Hilfe.
Schreiben Sie die SQL-Abfrage und führen Sie sie aus. Und jeder Filter kann verwendet werden – AKSW
was wäre die SQL-Abfrage explizit sein –