2016-07-20 3 views
0

Im Moment habe ich einen ineffizienten Ansatz:Wie finde ich alle Daten, die eine ID enthalten, aus einer Liste von IDs in Spark?

ids = [...] 
matched = [] 
    for id in ids: 
     d = data.where(data.id == id) 
     d = d.take(1) 
     matched.append(d[0][3]) 

Ich frage mich, wie ich schneller dies tun können? Die Daten enthalten 4 Spalten, wobei die vierte IDs enthält.

-UPDATE-

wie dies vielleicht?

sqlContext = SQLContext(sc) 
sqlContext.registerDataFrameAsTable(data, "data") 
s = ','.join(str(e) for e in ids) 
q = "SELECT * FROM data WHERE id IN (" + s + ")") 
sqlContext.sql(q).collect() 

Dies dauert 5 min statt 40 min bei der oben genannten Vorgehensweise.

+0

Also, IDs ist eine Liste von Zeilen? Warum ist es kein RDD oder Datenrahmen? – David

+0

Es ist ein Datenrahmen, glaube ich, aber ich bin sicher, weil ich gerade angefangen habe, Spark zu verwenden. Was ist Ihrer Meinung nach ein besserer Ansatz? – blpasd

Antwort

1

Im ersten Beispiel sammeln Sie alle Daten auf dem Treiberknoten und verarbeiten sie in Python. Sie erhalten nicht die Vorteile der Verwendung von Spark, weil der Ansatz nicht verteilt ist.

Der zweite Ansatz verwendet Spark SQL und ist verteilt. Sie können RDD apis auch wie folgt verwenden. Die RDD-APIs sind flexibler, aber in der Regel etwas langsamer. Wenn Sie die Dataframe-APIs (oder SQL-wie oben) verwenden können, bleiben Sie bei diesen.

ids = [...] 
data.rdd.filter(lambda x: x.id in ids).collect() 
+0

Danke. 4 Minuten und 35 Sekunden :) – blpasd