Programming lesson
Set Similarity Join mit Jaccard und Spark auf Google Dataproc: Ein praktischer Leitfaden
Lernen Sie, wie Sie mit Apache Spark und Google Dataproc einen Set Similarity Join unter Verwendung der Jaccard-Ähnlichkeit implementieren. Schritt-für-Schritt-Anleitung für Studierende und Datenenthusiasten.
Einführung in den Set Similarity Join
Der Set Similarity Join ist eine fundamentale Operation in der Datenanalyse, die verwendet wird, um ähnliche Datensätze aus zwei Kollektionen zu identifizieren. In diesem Tutorial zeigen wir, wie Sie diesen Join mit der Jaccard-Ähnlichkeit, Apache Spark und Google Dataproc umsetzen. Dieses Wissen ist nicht nur für die Universität, sondern auch für reale Anwendungen wie Empfehlungssysteme, Duplikaterkennung und Trendanalysen in sozialen Medien relevant.
Was ist die Jaccard-Ähnlichkeit?
Die Jaccard-Ähnlichkeit misst die Ähnlichkeit zweier Mengen als Größe der Schnittmenge geteilt durch die Größe der Vereinigungsmenge. Formal: sim(A, B) = |A ∩ B| / |A ∪ B|. Ein Wert von 1 bedeutet identische Mengen, 0 bedeutet keine gemeinsamen Elemente. In unserem Projekt verwenden wir einen Schwellwert τ, um nur Paare mit einer Ähnlichkeit ≥ τ auszugeben.
Projektkontext: COMP9313 2021T3
Dieses Tutorial basiert auf dem Projekt 3 des Kurses COMP9313 (2021T3) an der UNSW. Ziel ist es, einen Self-Join auf einer einzelnen Datei durchzuführen, wobei jede Zeile eine RecordId und eine Liste von Integer-Elementen enthält. Die Ausgabe sind Paare von RecordIds mit ihrer Jaccard-Ähnlichkeit, sortiert nach RecordId1.
Voraussetzungen und Umgebung
Sie benötigen ein Google Cloud Platform-Konto mit aktiviertem Dataproc und Zugang zu Cloud Storage. Installieren Sie die Google Cloud SDK und konfigurieren Sie Ihre Umgebung. Für dieses Beispiel verwenden wir Spark 2.4 oder höher.
Datenvorbereitung
Laden Sie die Beispieldateien tiny-data.txt und flickr_small.txt von den angegebenen Links herunter und speichern Sie sie in einem Cloud Storage-Bucket. Jede Zeile hat das Format: RecordId Element1 Element2 ...
Implementierung des Set Similarity Join mit Spark
Wir werden eine PySpark-Anwendung schreiben, die die Daten liest, in Paare von RecordIds und Sets umwandelt, die Jaccard-Ähnlichkeit für jedes Paar berechnet und die Ergebnisse filtert und sortiert.
Schritt 1: Daten einlesen und parsen
from pyspark import SparkContext
sc = SparkContext()
data = sc.textFile("gs://your-bucket/tiny-data.txt")
def parse_line(line):
parts = line.split()
record_id = int(parts[0])
items = set(map(int, parts[1:]))
return (record_id, items)
parsed = data.map(parse_line)Schritt 2: Kartesisches Produkt und Ähnlichkeitsberechnung
Da es sich um einen Self-Join handelt, erzeugen wir das kartesische Produkt aller Paare (r, s) mit r < s, um doppelte Paare zu vermeiden.
def generate_pairs(record):
id1, set1 = record
# Wir geben eine Liste von Tupeln zurück, die später mit flatMap verarbeitet wird
return [(id1, set1)]
# Um das kartesische Produkt zu vermeiden, verwenden wir einen Ansatz mit Broadcast-Variablen oder Cross Join.
# Für kleine Daten können wir collectAsMap verwenden, aber für große Daten ist Cross Join besser.
# Hier zeigen wir einen Cross Join mit Spark SQL.
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = parsed.toDF(["id", "items"])
df.createOrReplaceTempView("records")
result = spark.sql("""
SELECT a.id AS id1, b.id AS id2,
size(array_intersect(a.items, b.items)) / size(array_union(a.items, b.items)) AS similarity
FROM records a
CROSS JOIN records b
WHERE a.id < b.id
""")Beachten Sie: array_intersect und array_union funktionieren mit Arrays, nicht mit Sets. Wir müssen die Sets in Arrays umwandeln oder eine UDF verwenden. Für dieses Tutorial nehmen wir an, dass wir eine UDF für die Jaccard-Ähnlichkeit definieren.
Schritt 3: Filterung nach Schwellwert und Sortierung
threshold = 0.5
filtered = result.filter(result.similarity >= threshold)
sorted_result = filtered.orderBy(["id1", "id2"])
sorted_result.show()Schritt 4: Ausgabe in Datei
sorted_result.rdd.map(lambda row: f"({row.id1},{row.id2})\t{row.similarity}").saveAsTextFile("gs://your-bucket/output")Ausführung auf Google Dataproc
Erstellen Sie einen Dataproc-Cluster mit Spark und übermitteln Sie das Job. Verwenden Sie die gcloud CLI oder die Konsole.
gcloud dataproc jobs submit pyspark --cluster=cluster-name --region=region script.pyBeispiel und erwartete Ergebnisse
Für tiny-data.txt mit τ=0.5 erwarten wir folgende Ausgabe (aus der Aufgabenstellung):
(0,1) 0.75
(1,2) 0.5
(2,3) 0.5
(3,4) 0.5Überprüfen Sie die Ähnlichkeiten manuell, um Ihr Verständnis zu festigen.
Optimierung und Best Practices
Für große Datenmengen ist der Cross Join ineffizient. Verwenden Sie stattdessen Techniken wie MinHash LSH (Locality Sensitive Hashing), um die Kandidatenpaare zu reduzieren. Dies ist besonders nützlich bei Anwendungen wie der Duplikaterkennung in großen Textsammlungen oder der Ähnlichkeitssuche in Empfehlungssystemen.
Trendbezug: Ähnlichkeitssuche in KI und sozialen Medien
Aktuelle Trends wie personalisierte Empfehlungen auf TikTok oder die Duplikaterkennung in KI-generierten Inhalten nutzen ähnliche Algorithmen. Das Verständnis von Set Similarity Joins ist daher eine wertvolle Fähigkeit für Datenwissenschaftler.
Fehlerbehebung und häufige Probleme
- Speicherprobleme: Erhöhen Sie die Executor-Speicherkonfiguration in Dataproc.
- Typfehler: Stellen Sie sicher, dass Sie Sets und Arrays korrekt verwenden.
- Sortierung: Verwenden Sie
orderByfür die korrekte Ausgabereihenfolge.
Zusammenfassung
Sie haben gelernt, wie Sie einen Set Similarity Join mit Jaccard-Ähnlichkeit auf Spark implementieren und auf Google Dataproc ausführen. Dieses Projekt ist ein wichtiger Baustein für fortgeschrittene Datenanalyseaufgaben. Üben Sie mit verschiedenen Datensätzen und Schwellwerten, um Ihr Verständnis zu vertiefen.
Weiterführende Ressourcen
- Apache Spark Dokumentation
- Google Dataproc Anleitungen
- Studienmaterialien zu COMP9313