Поиск наиболее распространенного ненулевого префикса для каждой группы в Spark - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно написать структурированный запрос, который находит наиболее распространенные непустые PREFIX (вхождения) для UNIQUE_GUEST_ID. Есть входные данные:

val inputDf = Seq(
  (1, "Mr"),
  (1, "Mme"),
  (1, "Mr"),
  (1, null),
  (1, null),
  (1, null),
  (2, "Mr"),
  (3, null)).toDF("UNIQUE_GUEST_ID", "PREFIX")
println("Input:")
inputDf.show(false)

Мое решение было:

inputDf
  .groupBy($"UNIQUE_GUEST_ID")
  .agg(collect_list($"PREFIX").alias("PREFIX"))

Но это не то, что мне нужно: Ожидается:

+---------------+------+
|UNIQUE_GUEST_ID|PREFIX|
+---------------+------+
|1              |Mr    |
|2              |Mr    |
|3              |null  |
+---------------+------+

Фактически:

+---------------+-------------+
|UNIQUE_GUEST_ID|PREFIX       |
+---------------+-------------+
|1              |[Mr, Mme, Mr]|
|3              |[]           |
|2              |[Mr]         |
+---------------+-------------+

Ответы [ 2 ]

1 голос
/ 18 июня 2020
val df2 = inputDf.groupBy('UNIQUE_GUEST_ID,'PREFIX).agg(count('PREFIX).as("ct"))
val df3 = df2.groupBy('UNIQUE_GUEST_ID).agg(max('ct).as("ct"))
df2.join(df3,Seq("ct","UNIQUE_GUEST_ID")).show()

вывод:

+---+---------------+------+
| ct|UNIQUE_GUEST_ID|PREFIX|
+---+---------------+------+
|  1|              2|    Mr|
|  0|              3|  null|
|  2|              1|    Mr|
+---+---------------+------+
1 голос
/ 18 июня 2020

Попробуйте это -

 val inputDf = Seq(
      (1, "Mr"),
      (1, "Mme"),
      (1, "Mr"),
      (1, null),
      (1, null),
      (1, null),
      (2, "Mr"),
      (3, null)).toDF("UNIQUE_GUEST_ID", "PREFIX")
    println("Input:")
    inputDf.show(false)
    /**
      * Input:
      * +---------------+------+
      * |UNIQUE_GUEST_ID|PREFIX|
      * +---------------+------+
      * |1              |Mr    |
      * |1              |Mme   |
      * |1              |Mr    |
      * |1              |null  |
      * |1              |null  |
      * |1              |null  |
      * |2              |Mr    |
      * |3              |null  |
      * +---------------+------+
      */

    inputDf
      .groupBy($"UNIQUE_GUEST_ID", $"PREFIX").agg(count($"PREFIX").as("count"))
      .groupBy($"UNIQUE_GUEST_ID")
      .agg(max( struct( $"count", $"PREFIX")).as("max"))
      .selectExpr("UNIQUE_GUEST_ID", "max.PREFIX")
      .show(false)

    /**
      * +---------------+------+
      * |UNIQUE_GUEST_ID|PREFIX|
      * +---------------+------+
      * |2              |Mr    |
      * |1              |Mr    |
      * |3              |null  |
      * +---------------+------+
      */
...