首页 > 解决方案 > Pyspark - groupby([col list]).agg(count([col list))

问题描述

我怎样才能做到这一点?

from pyspark.sql import functions as F
from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession
sc = SparkContext('local')
spark = SparkSession(sc)
grouped=df.groupby([col list]).agg(F.count([col list]))

我已经阅读了关于 stackoverflow 的类似问题,但找不到确切的答案。

即使我尝试放一列

grouped=dfn.groupby('col name').agg(F.count('col name'))

我得到 -

py4j\java_collections.py",第 500 行,转换为对象中的元素:TypeError: 'type' object is not iterable

参考问题 - pyspark 列不可迭代

我事先不知道列名,需要通过 agg 函数提供列表作为组的输入。

标签: pythonapache-sparkpyspark

解决方案


您可以简单地对对象使用.count()方法。GroupedData

让我们准备一些数据(我假设您在变量下有SparkSession可用的对象)spark

>>> import pandas as pd
>>>
>>> pdf = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
>>> df = spark.createDataFrame(pdf)
>>> df.show(5)

+------------+-----------+------------+-----------+-------+
|sepal_length|sepal_width|petal_length|petal_width|species|
+------------+-----------+------------+-----------+-------+
|         5.1|        3.5|         1.4|        0.2| setosa|
|         4.9|        3.0|         1.4|        0.2| setosa|
|         4.7|        3.2|         1.3|        0.2| setosa|
|         4.6|        3.1|         1.5|        0.2| setosa|
|         5.0|        3.6|         1.4|        0.2| setosa|
+------------+-----------+------------+-----------+-------+
only showing top 5 rows

然后只需groupBy(*cols)在 DataFrame 中的所需列上使用方法。

>>> grouped = df.groupBy(['petal_width', 'species']).count()
>>> grouped.show(5)

+-----------+----------+-----+
|petal_width|   species|count|
+-----------+----------+-----+
|        1.7| virginica|    1|
|        2.2| virginica|    3|
|        1.8| virginica|   11|
|        1.9| virginica|    5|
|        1.5|versicolor|   10|
+-----------+----------+-----+
only showing top 5 rows

推荐阅读