Pyspark - Как отделить конкретное значение из строки в отдельный столбец - PullRequest
0 голосов
/ 10 декабря 2018

Используя pysparks и работая с некоторыми данными о визге, я пытаюсь подсчитать тех, кто является элитными членами, и тех, кто этого не делает.

df_Usr2.groupby(['name', 'business_id', 'Elite_Member']).count().sort('business_id', acending=True).show(50, truncate=False)

Когда я создаю счет прямо сейчас, он отображает их сверху вниз, как показано ниже, я пытался показать их рядом, с .withColumn, у которого был счетдля None Elites.

В настоящее время это так:

[name]   [Business_id]   [EliteMem] [Count]
   a          123            No        5
   a          123            Yes      10

Я надеялся на что-то более похожее на это:

 [name]   [Business_id]   [EliteMem] [NonEliteMem]
    a          123            10           5

Вот этоПосмотрите, как выглядит мой фрейм данных

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете использовать groupby с pivot и sum (http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.GroupedData.pivot)

df1 = sqlContext.createDataFrame([
                    Row(name="a",
                        business_id=123,
                        elitemem="no",
                        count=5),
                    Row(name="a",
                        business_id=123,
                        elitemem="yes",
                        count=10)]
                        )

 df1.show()
+-----------+-----+--------+----+
|business_id|count|elitemem|name|
+-----------+-----+--------+----+
|        123|    5|      no|   a|
|        123|   10|     yes|   a|
+-----------+-----+--------+----+

df1.groupby('name','business_id').pivot('elitemem',['no','yes']).sum('count').show()
+----+-----------+---+---+
|name|business_id| no|yes|
+----+-----------+---+---+
|   a|        123|  5| 10|
+----+-----------+---+---+

Если вас беспокоит то, что имена столбцов no и yes, вы можете следоватьэтот подход.

from pyspark.sql import functions as F
df2 = df1.withColumn("elitemem_new",F.when(df1['elitemem']=="yes","elitemem").otherwise("nonelitemem"))

 df2.groupby('name','business_id').pivot('elitemem_new').sum('count').show()
+----+-----------+--------+-----------+
|name|business_id|elitemem|nonelitemem|
+----+-----------+--------+-----------+
|   a|        123|      10|          5|
+----+-----------+--------+-----------+
...