Ich bin neu mit Spark
und ich muss mit großen Zeitreihen umgehen. Für einen Benchmark muss ich mehrere Implementierungen eines Rollmeans vergleichen. Im Iterationsmodus mit numpy ist es sehr schnell (0,055970s für 1.000.000 Punkte und Fenster = 3). Ich schrieb eine New-comer-in-pyspark-Version eines Rollmeans, und die Ergebnisse sind schrecklich (mehrere Sekunden für den gleichen Vektor). Zum Beispiel, ich habeWie würdest du ein Rollmittel in Funken schreiben?
ts_list = ["key1", "key2",...,"keyN"]
seq = sc.parallelize(ts_list)
d = {"key1": [1, 2, 3, ...], "key2": [1, 2, 3, ...]}
Meine Verarbeitung:
s = seq.map(lambda s: (s, d[s]))\
.flatMap(lambda s: [(s[0], sum(elem)/k) for elem in rolling_window(np.array(s[1]), k)])\
.groupByKey().mapValues(lambda x: list(x))\
.collect()
Ich denke, dass ein Arbeitnehmer für k Punkte mit wertlos. Ich vermute, dass die Kommunikation zwischen Meister und Arbeitern zeitaufwendig ist. Auch ich frage mich, ob ich Daten in den Treiber mit Parallelisierung oder innerhalb von Arbeitern laden sollte?
Was ist, wenn meine Vektoren Billionen von Punkten haben?
Nun, Sie verwenden 'groupBy' und das Verfahren verbraucht viel von Zeit, weil es das Bewegen der Daten zwischen allen Knoten erfordert. –