Добавить агрегированные столбцы в сводку без объединения

Используйте модуль binascii:

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

См. этот ответ: Python 3.1.1 string to hex

0
задан Pavel Prochazka 28 February 2019 в 09:14
поделиться

1 ответ

Я думаю, что вы не можете обойти объединение, потому что стержню понадобятся значения временных меток, и первая группа не должна их учитывать. Поэтому, если вам нужно создать значения 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|
+---+---+---+---+---+---+
0
ответ дан gaw 28 February 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: