Pysaprk multi groupby с разными столбцами - PullRequest
2 голосов
/ 29 мая 2020

У меня есть данные, как показано ниже

year    name    percent     sex
1880    John    0.081541    boy
1881    William 0.080511    boy
1881    John    0.050057    boy

Мне нужно сгруппировать и подсчитать, используя разные столбцы

df_year = df.groupby('year').count()
df_name = df.groupby('name').count()
df_sex = df.groupby('sex').count()

, тогда мне нужно создать окно, чтобы получить данные из топ-3 каждый столбец

window = Window.partitionBy('year').orderBy(col("count").desc())
top4_res = df_year.withColumn('topn', func.row_number().over(window)).\
                                              filter(col('topn') <= 4).repartition(1)

предположим, у меня есть сотни столбцов для группировки, подсчета и операции topk_3.

могу я сделать все это за один раз?

или есть какие-нибудь лучшие способы сделать это?

Ответы [ 2 ]

4 голосов
/ 29 мая 2020

Я не уверен, будет ли это соответствовать вашим требованиям, но если вас устраивает один фрейм данных, я думаю, это может дать вам начало, дайте мне знать, если в противном случае. Вы можете сложить эти 3 столбца (или больше), а затем сгруппировать и подсчитать:

cols = ['year','name','sex']
e = f"""stack({len(cols)},{','.join(map(','.join,
             (zip([f'"{i}"' for i in cols],cols))))}) as (col,val)"""

(df.select(*[F.col(i).cast('string') for i in cols]).selectExpr(e)
 .groupBy(*['col','val']).agg(F.count("col").alias("Counts")).orderBy('col')).show()

+----+-------+------+
| col|    val|Counts|
+----+-------+------+
|name|   John|     2|
|name|William|     1|
| sex|    boy|     3|
|year|   1881|     2|
|year|   1880|     1|
+----+-------+------+

Если вам нужна широкая форма, вы также можете развернуть, но я думаю, что длинная форма будет полезна:

(df.select(*[F.col(i).cast('string') for i in cols]).selectExpr(e)
 .groupBy('col').pivot('val').agg(F.count('val')).show())

+----+----+----+----+-------+----+
| col|1880|1881|John|William| boy|
+----+----+----+----+-------+----+
|name|null|null|   2|      1|null|
|year|   1|   2|null|   null|null|
| sex|null|null|null|   null|   3|
+----+----+----+----+-------+----+

0 голосов
/ 29 мая 2020

Если вы хотите, чтобы верхние n значений столбцов имели наибольшее количество, это должно работать:

from pyspark.sql.functions import *

columns_to_check = [ 'year', 'name' ]
n = 4

for c in columns_to_check:
  # returns a dataframe
  x = df.groupBy(c).count().sort(col("count").desc()).limit(n)
  x.show()

  # returns a list of rows
  x = df.groupBy(c).count().sort(col("count").desc()).take(n)
  print(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...