Я хочу решить следующую проблему в pyspark .
У меня есть огромный набор данных, по которому я хотел бы вычислить базовую c статистику, которая должна храниться в толковый словарь.
Набор данных приблизительно изображен в таблице ниже, хотя на самом деле он больше.
Тип данных целевых данных, которые меня интересуют, представляет собой либо строку, либо двойное число.
| key1 | ... | key2 | key3 | value1 | ... | value2 |
|--------|-----|--------|--------|--------|-----|--------|
| string | ... | string | string | double | ... | double |
Я должен выполнить groupBy для [key1, key2, key3] и вычислить среднее значение и стандартное отклонение как значения1, так и значения2.
Затем я хочу сохранить все результаты в словарь со следующей структурой:
dict {[key1, key2, key3] : [avg1, sd1, avg2, sd2]}
Мой первоначальный подход состоял в том, чтобы сначала выполнить вычисления, что-то вроде:
sparkdf.groupBy(keys).agg(avg(v1), stddev(v1), avg(v2), stddev(v2))
, а затем преобразовать получившийся sparkdf в pandasdf и l oop над строками, чтобы построить дикт. Но для больших наборов данных я очень сомневаюсь, что этот подход будет разумным.
Я узнал, что одним из способов сделать это было бы использование карт и пользовательских функций.
Например:
sparkdf.groupBy(keys)
.agg(collect_list(create_map([avg1, sd1, avg2, sd2]).alias('map')))
map = udf(lambda maps: {key:r[key] for r in map for key in r},
MapType( StringType(), DoubleType())
dict = do something with the map
Этот тип решения - то, что обсуждалось в этом топи c ( Pyspark Dataframe, чтобы продиктовать ).
Однако , в моем В случае, если у меня нет значений [avg1, sd1, avg2, sd2], которые необходимо вычислить с помощью операции groupBy. Поскольку используются такие методы, как collect_list и create_map, я не могу поместить в них avg (v1), иначе мне будет выдано сообщение об ошибке.
Кто-нибудь может подсказать, как бы вы go высказались по поводу создания нужного мне диктанта?
Большое спасибо!