Я думаю, что вы не можете обойти объединение, потому что стержню понадобятся значения меток времени, и первая группа не должна их учитывать.Поэтому, если вам нужно создать значения NE
и cnt
, вы должны сгруппировать фрейм данных только по id
, что приведет к потере метки времени, если вы хотите сохранить значения в столбцах, вы должны сделать сводку, как высделал отдельно и присоедините его обратно.
Единственное улучшение, которое можно сделать, это перенести фильтр в создание df1.Как вы сказали, это уже может улучшить производительность, поскольку df1 должен быть намного меньше после фильтрации ваших реальных данных.
from pyspark.sql.functions import *
df=sc.parallelize([(1,1,1),(5,0,2),(27,1,1),(1,0,3),(5,1,1),(1,0,2)]).toDF(['id', 'error', 'timestamp'])
df1=df.groupBy('id').agg(sum('error').alias('Ne'),count('*').alias('cnt')).filter(col('cnt')>1)
df2=df.groupBy('id').pivot('timestamp').agg(count('*')).fillna(0)
df1.join(df2, on='id').show()
Выход:
+---+---+---+---+---+---+
| id| Ne|cnt| 1| 2| 3|
+---+---+---+---+---+---+
| 5| 1| 2| 1| 1| 0|
| 1| 1| 3| 1| 1| 1|
+---+---+---+---+---+---+