Как отфильтровать фрейм данных в JSON, чтобы показать количество имен как мужских, так и женских? - PullRequest
0 голосов
/ 11 сентября 2018

У меня проблемы с составлением запроса, который фильтрует существующий фрейм данных, чтобы показать количество имен, одинаковых как для мужчин, так и для женщин.

Мы назначили имя как женское, если число женщин и мужчин было одинаковым. Напишите фильтр на основе dF_ssa5 DataFrame, чтобы подсчитать и распечатать, сколько раз это происходит и сколько всего имен.

With df_ssa5 being a given dataframe; 
df_ssa5 = df_ssa4.groupBy("name").sum("F","M").withColumnRenamed("sum(F)","women").withColumnRenamed("sum(M)","men")

df_ssa5.show()

Если бы кто-нибудь мог помочь, это было бы здорово.

Желаемый результат будет примерно таким, но с теми же именами и количеством отображаемых имен, как для мужчин, так и для женщин:

enter image description here

1 Ответ

0 голосов
/ 11 сентября 2018

вам нужно использовать groupBy операции вместе с агрегатами spark, как показано ниже:

import org.apache.spark.sql.functions._
import sparkSession.sqlContext.implicits._

val df = Seq(("Soni", "F"),("Lorne", "F"),("Lorne", "F"), ("Bonnye", "F"),("Lorne", "M"),("Nimrit", "M")).toDF("name","gender")

val result = df.groupBy("name")
  .agg(
    sum(when($"gender" === "M", lit(1))).as("men_count"),
    sum(when($"gender" === "F", lit(1))).as("women_count")
  )

result.show(false)

result.filter($"men_count".isNotNull && $"women_count".isNotNull).show(false)

Выход:

+------+---------+-----------+
|name  |men_count|women_count|
+------+---------+-----------+
|Soni  |null     |1          |
|Lorne |1        |2          |
|Bonnye|null     |1          |
|Nimrit|1        |null       |
+------+---------+-----------+

+-----+---------+-----------+
|name |men_count|women_count|
+-----+---------+-----------+
|Lorne|1        |2          |
+-----+---------+-----------+
...