Дублирование количества записей в Apache Spark - PullRequest
0 голосов
/ 03 мая 2018

Это расширение этого вопроса, Группа Apache Spark путем объединения типов и подтипов .

val sales = Seq(
  ("Warsaw", 2016, "facebook","share",100),
  ("Warsaw", 2017, "facebook","like",200),
  ("Boston", 2015,"twitter","share",50),
  ("Boston", 2016,"facebook","share",150),
  ("Toronto", 2017,"twitter","like",50)
).toDF("city", "year","media","action","amount")

Все хорошо с этим решением, однако ожидаемый результат следует условно считать в разных категориях.

Итак, вывод должен выглядеть так:

+-------+--------+-----+
| Boston|facebook|    1|
| Boston| share1 |    2|
| Boston| share2 |    2|
| Boston| twitter|    1|
|Toronto| twitter|    1|
|Toronto| like   |    1|
| Warsaw|facebook|    2|
| Warsaw|share1  |    1|
| Warsaw|share2  |    1|
| Warsaw|like    |    1|
+-------+--------+-----+

Здесь, если действие является share, мне нужно, чтобы это учитывалось как в share1, так и в share2. Когда я подсчитываю это программно, я использую инструкцию case и говорю case, когда действие - это share, share1 = share1 +1, share2 = share2 + 1

Но как я могу сделать это в Scala или pyspark или sql?

1 Ответ

0 голосов
/ 03 мая 2018

Простой filter и unions должен дать вам желаемый результат

val media = sales.groupBy("city", "media").count()

val action = sales.groupBy("city", "action").count().select($"city", $"action".as("media"), $"count")

val share = action.filter($"media" === "share")

  media.union(action.filter($"media" =!= "share"))
      .union(share.withColumn("media", lit("share1")))
      .union(share.withColumn("media", lit("share2")))
      .show(false)

, который должен дать вам

+-------+--------+-----+
|city   |media   |count|
+-------+--------+-----+
|Boston |facebook|1    |
|Boston |twitter |1    |
|Toronto|twitter |1    |
|Warsaw |facebook|2    |
|Warsaw |like    |1    |
|Toronto|like    |1    |
|Boston |share1  |2    |
|Warsaw |share1  |1    |
|Boston |share2  |2    |
|Warsaw |share2  |1    |
+-------+--------+-----+
...