pyspark несколько операторов groupby для запуска подсчета частоты в списке переменных - PullRequest
0 голосов
/ 23 апреля 2020

Я видел подобные сообщения, но не нашел именно то, что мне нужно. У меня есть рабочий код для производства того, что я хочу, но я чувствую, что он не использует в полной мере преимущества параллелизма искр. в основном, взять набор данных, как показано ниже ...

+----------+---------+------------+------------+------------+
|      v1  | v2      |v3          |v4          |v5          |
+----------+---------+------------+------------+------------+
|a         |furniture|         bed|         bed|          s |
|a         |furniture|       chair|         bed|          e |
|b         |furniture|       shelf|         bed|          t |
|b         |furniture|         bed|         bed|          t |
|c         |furniture|       chair|         bed|          v |
|d         |furniture|       shelf|         rug|          v |
|d         |      rug|      circle|         rug|          v |
|d         |      rug|      square|      circle|          v |
|d         |      rug|      circle|      circle|          v |
|d         |      rug|      square|      circle|          v |
+----------+---------+------------+------------+------------+

и l oop через groupby каждого столбца, собрать и добавить результаты в pandas фрейм данных, чтобы выглядеть примерно так ...

+----------+---------+------------+------------+------------+
|     Var  | Varname |   Value    |    Counts  |   PCT      |
+----------+---------+------------+------------+------------+
|v1        |v1title  |         a  |         2  |         .2 |
|v1        |v1title  |         b  |         2  |         .2 |
|v1        |v1title  |         c  |         1  |         .1 |
|v1        |v1title  |         d  |         5  |         .5 |
|v2        |v2title  |   furniture|         6  |         .6 |
|v2        |v2title  |       rug  |         4  |         .4 |
|v3        |v3title  |      bed   |         2  |         .2 |
|v3        |v3title  |      chair |         2  |         .2 |
|v3        |v3title  |      shelf |         2  |         .2 |
|v3        |v3title  |      circle|         2  |         .2 |
|v3        |v3title  |      square|         2  |         .2 |
+----------+---------+------------+------------+------------+
ect...

Я использую словарь, чтобы назначать метки и заголовки для переменных и значений. Все данные, с которыми я работаю, являются категориальными, и значения представляют собой более крупный текст, поэтому данные представляют собой аббревиатуры, которые я затем должен сопоставить с конечным значением вместо того, чтобы обрабатывать весь текст, занимающий память. Проблема с этим заключается в том, что он должен выполнять групповую загрузку для каждого столбца независимо, что действительно является тем, что я хочу, но у меня есть сотни столбцов, а иногда и более 1 тыс. Столбцов, поэтому я хотел бы выполнять групповую загрузку параллельно вместо последовательных запусков, как сейчас. , Является ли это случаем для pivot или использования оконных функций, и если да, то как именно будет выглядеть внешний вид.

Код:

def reportcnt(df,field,dicmap):
    result=pd.DataFrame(df.select(field).groupby(field).count().collect()).rename(columns={0:'Value',1:'Counts'}).assign(Var=field,PCT=lambda x:round(x.Counts/x.Counts.sum()*100,2))[['Var','Value','Counts','PCT']]
if dicmap != None:
    result['VarName']=dicmap['title']
    result.Value=result.Value.map(dicmap['labels']).fillna(result.Value)
    result[['Var','VarName','Value','Counts','PCT']]
return result
reportresultT=pd.concat([reportcnt(dfa,v,VarDict[v]) for v in varlist],ignore_index=True)
...