Вы можете разбить массив и отфильтровать взорванные значения для 1
.Затем groupBy
и count
:
from pyspark.sql.functions import col, count, explode
df.select("*", explode("list_of_numbers").alias("exploded"))\
.where(col("exploded") == 1)\
.groupBy("letter", "list_of_numbers")\
.agg(count("exploded").alias("ones"))\
.show()
#+------+---------------+----+
#|letter|list_of_numbers|ones|
#+------+---------------+----+
#| A| [3, 1, 2, 3]| 1|
#| B| [1, 2, 1, 1]| 3|
#+------+---------------+----+
Чтобы сохранить все строки, даже когда счетчик равен 0, вы можете преобразовать столбец exploded
в переменную индикатора.Затем groupBy
и sum
.
from pyspark.sql.functions import col, count, explode, sum as sum_
df.select("*", explode("list_of_numbers").alias("exploded"))\
.withColumn("exploded", (col("exploded") == 1).cast("int"))\
.groupBy("letter", "list_of_numbers")\
.agg(sum_("exploded").alias("ones"))\
.show()
Обратите внимание, я импортировал pyspark.sql.functions.sum
как sum_
, чтобы не перезаписывать встроенную функцию sum
.