Я пытаюсь сделать простой поиск и агрегацию (больших) CSV из грамм Google. Для этого у меня есть широковещательная переменная patterns_set
, которой принадлежат все ключи, которые я хочу найти, и затем я ищу их в df
, pyspark.sql.DataFrame
, созданном в формате databricks.csv
.
Поэтому я хочу сгруппировать по ngram
(столбец 0), а затем суммировать по match_count
(столбец 1).
Но есть разница в величине между вычислениями этой работы с RDD или с DataFrames, когда я пытаюсь локально (16 мс против 43 с). Не совсем уверен, что это происходит и в кластере, хотя - это ожидаемое ?
%%time
from operator import itemgetter, add
df.rdd.filter(lambda x: x[0] in patterns_set.value).keyBy(itemgetter(0))\
.mapValues(itemgetter(1))\
.mapValues(int)\
.reduceByKey(add)
И это занимает:
CPU times: user 7.04 ms, sys: 3.24 ms, total: 10.3 ms
Wall time: 16.7 ms
Но при попытке с фреймами данных:
%%time
df.filter(df.ngram.isin(patterns_set.value))\
.groupby('ngram').sum('match_count')
Время стены намного больше
CPU times: user 6.78 s, sys: 1.54 s, total: 8.32 s
Wall time: 43.3 s