2017-02-07 10 views
1

Я новичок в Spark, и я пытаюсь применить groupby и count к моей dataframe df по атрибуту users.Подсчет гранул и groubpy в pyspark

import pandas as pd 

comments = [ (1, "Hi I heard about Spark"), 
    (1, "Spark is awesome"), 
    (2, None), 
    (2, "And I don't know why..."), 
    (3, "Blah blah")] 

df = pd.DataFrame(comments) 
df.columns = ["users", "comments"] 

, который выглядит, как это панды

 users     comments 
0  1 Hi I heard about Spark 
1  1   Spark is awesome 
2  2      None 
3  2 And I don't know why 
4  3    Blah blah 

Я хочу найти эквивалент следующего кода панд для pyspark

df.groupby(['users'])['users'].transform('count') 

Результат выглядит следующим образом:

0 2 
1 2 
2 2 
3 2 
4 1 
dtype: int64 

Не могли бы вы помочь мне, как я могу это реализовать в PySpark?

ответ

1

Это должно работать в pyspark: df.groupby('user').count(). В pyspark groupby() является псевдонимом для groupBy()Pyspark docs are pretty easy reading with some good examples.

UPDATE:

Теперь, когда я понимаю просьбу немного лучше, это не кажется, что pyspark имеет INPLACE transform поддержку еще. See this answer.

Но вы можете сделать это через соединение.

df2=df.groupby('users').count() 
df.join(df2, df.users==df2.users, "left")\ 
    .drop(df2.users).drop(df.comments) 

+-----+-----+ 
|users|count| 
+-----+-----+ 
| 1| 2| 
| 1| 2| 
| 3| 1| 
| 2| 2| 
| 2| 2| 
+-----+-----+ 
+0

Thanks @data_steve. Я думаю, что моя проблема в части 'transform'. Я хотел бы вставить подсчитанные значения в новый столбец (или столбец 'user') в один и тот же файл. В любом случае, простые способы сделать это? – MomoPP

+0

@MomoPP, как правило, вы даете небольшой пример данных, чтобы проиллюстрировать, что вы имеете в виду, как от того, где вы начинаете, так и от того, что вы хотите вывести, чтобы выглядеть. Я немного смущен этой формулировкой в ​​вашем посте «замените ее на значения count». К чему это относится: пользовательский столбец или блок данных? –

+1

Большое спасибо, Стив, за то, что вы сбились с пути и помогли мне здесь. Извините за то, что вы недостаточно подробно рассказали об этой проблеме. Теперь это имеет смысл. Отличная работа. – MomoPP