В спарке есть несколько функций count, которые меня вначале путали, и тут я хочу расставить все точки над i.
1️⃣ count() - это действие
Оно запустит весь пайплайн расчетов и выведет на экран одно число - количество строк в датафрейме:
df.count()
Также можно использовать в агрегации, но нельзя поменять название столбца (будет count):
df.groupBy('category')
.count()
.orderBy('count')
.show()2️⃣ F.count() - это трансформация, агрегирующая функция
df.select(F.count('id')).show()В отличие от первого способа в агрегации можно поменять название столбца:
df.groupBy('category')
.agg(F.count('id').alias('cnt'))
.orderBy('cnt')
.show()Отличия count() и F.count():
# результат - датафрейм с одной ячейкой
df1.select(F.count('id')).show()
# +---------+
# |count(id)|
# +---------+
# | 3|
# +---------+
# результат - число
df1.select('id').count()
# 3
3️⃣ F.countDistinct() - тоже агрегирующая функция
df.select(F.countDistinct('id')).show()Тут вариант агрегации только один, потому что df.countDistinct() не существует:
df.groupBy('category')
.agg(F.countDistinct('id'))
.show()При этом в спарке есть еще функция distinct(), которая тоже вносит некую путаницу.
Отличия distinct().count() и F.countDistinct():
# результат - датафрейм с одной ячейкой
df1.select(F.countDistinct('id')).show()
# +------------------+
# |count(DISTINCT id)|
# +------------------+
# | 2|
# +------------------+
# результат - число
df1.select('id').distinct().count()
# 2
#spark