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