Assignment Chef icon Assignment Chef
All German tutorials

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.

Set Similarity Join Jaccard Ähnlichkeit Apache Spark Google Dataproc COMP9313 PySpark Tutorial Datenanalyse Spark Similarity Join Implementierung Jaccard Koeffizient Spark Self Join Cloud Dataproc Spark Ähnlichkeitssuche Big Data Duplikaterkennung Spark Empfehlungssysteme Spark MinHash LSH Spark Trendanalyse soziale Medien

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.py

Beispiel 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 orderBy fü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