DataPrame pyspark в словарь после групповых операций - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу решить следующую проблему в 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 высказались по поводу создания нужного мне диктанта?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...