Используйте модуль binascii
:
>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'
См. этот ответ: Python 3.1.1 string to hex
Я думаю, что вы не можете обойти объединение, потому что стержню понадобятся значения временных меток, и первая группа не должна их учитывать. Поэтому, если вам нужно создать значения 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|
+---+---+---+---+---+---+