Scala Window Partition при обновлении случайной записи - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующие данные:

group_id    id  name
----        --  ----
G1          1   apple
G1          2   orange
G1          3   apple
G1          4   banana
G1          5   apple
G2          6   orange
G2          7   apple
G2          8   apple
G3          7   banana
G3          8   orange

Я хочу обновить 1 случайную запись каждой группы с 1, остальные все должно быть равно нулю, например:

group_id    id  name   random_pick
----        --  ----   -------------------
G1          1   apple       0
G1          2   orange      0
G1          3   apple       0
G1          4   banana      0
G1          5   apple       1
G2          6   orange      0
G2          7   apple       1
G2          8   apple       0
G3          7   banana      0
G3          8   orange      1

Мои мысли:

  1. Добавить столбец с 0 в качестве значения по умолчанию
  2. использовать Window.partitionBy ("group_id"), затем получить счетчик каждой группы, выбрать случайное число от 1 до счетчика, обновить значениезапись на 1

а как в скале ?!: (

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Более многословно, чем @ TerryDactyl

case class Tup(groupId: String,
               id: Int,
               name: String,
               randomPick: Boolean = false)

val ts = Seq(
  Tup("G1", 1, "apple"),
  Tup("G1", 2, "orange"),
  Tup("G1", 3, "apple"),
  Tup("G1", 4, "banana"),
  Tup("G1", 5, "apple"),
  Tup("G2", 6, "orange"),
  Tup("G2", 7, "apple"),
  Tup("G2", 8, "apple"),
  Tup("G3", 7, "banana"),
  Tup("G3", 8, "orange")
)

val grouped = ts.groupBy(_.groupId)
val withChosen = grouped.map{case (_, ts) => 
  val l = ts.length
  val i = scala.util.Random.nextInt(l)
  ts.zipWithIndex.map{ case (tup, idx) =>
    if (idx == i) tup.copy(randomPick = true)
    else tup
  }
}
0 голосов
/ 04 октября 2018

Как насчет чего-то вроде ....

case class MyRow(group_id: Int, id: Int, name: String, randomPick: Boolean = false)

val randomPicks = myData.groupBy(_.groupId).toList.flatMap{
  case (_, l) => 
   val h :: t = scala.util.Random.shuffle(l)
   h.copy(randomPick = true) :: t
}
...