Scala 在apache spark中复制记录计数

Scala 在apache spark中复制记录计数,scala,apache-spark,pyspark,apache-spark-sql,spark-dataframe,Scala,Apache Spark,Pyspark,Apache Spark Sql,Spark Dataframe,这是这个问题的延伸 这种解决方案都很好,但是,预期产出应该有条件地在不同类别中计算 因此,输出应该如下所示: +-------+--------+-----+ | Boston|facebook| 1| | Boston| share1 | 2| | Boston| share2 | 2| | Boston| twitter| 1| |Toronto| twitter| 1| |Toronto| like | 1| | Warsaw|facebook|

这是这个问题的延伸

这种解决方案都很好,但是,预期产出应该有条件地在不同类别中计算

因此,输出应该如下所示:

+-------+--------+-----+
| 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语句并在操作为share时说case,share1=share1+1,share2=share2+1


但是,在Scala、pyspark或sql中如何实现这一点呢?

简单的
过滤器和
联合应能提供所需的输出

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    |
+-------+--------+-----+

谢谢但是你输出的最后两条记录有facebook1和facebook2,我不想要。如果你看我的问题,我已经提到,我需要有条件地计算它们,只要它们的份额。另外,你能解释一下你在UDF中做了什么吗。是的,因为输入数据有Warshaw的共享,所以它在输出中作为share1和share2。但与facebook1和facebook2不同。谢谢你的帮助,但我认为你的输出和我的输出是不同的。让我们来看看。
+-------+--------+-----+
|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    |
+-------+--------+-----+