如何在scala中获得不同的计数值

时间:2018-04-22 13:40:14

标签: scala

我想在scala中找到此查询的不同值

select  
    key,     
    count(distinct suppKey)  
from  
    file
group by  
    key ; 

我在scala中编写此代码,但没有工作。

val count= file.map(line=> (line.split('|')(0),line.split('|')(1)).distinct().count())

我进行拆分,因为key位于文件的第一行,而suppkey位于第二行。

文件:

1|52|3956|337.0
1|77|4069|357.8
1|7|14|35.2
2|3|8895|378.4
2|3|4969|915.2
2|3|8539|438.3
2|78|3025|306.3

预期产出:

1|3
2|2

2 个答案:

答案 0 :(得分:1)

为了简化测试,我使用String:

而不是文件
scala> val s="""1|52|3956|337.0
     | 1|77|4069|357.8
     | 1|7|14|35.2
     | 2|3|8895|378.4
     | 2|3|4969|915.2
     | 2|3|8539|438.3
     | 2|78|3025|306.3"""

scala> s.split("\n").map (line => {val sp = line.split ('|'); (sp(0), sp(1))}).distinct.groupBy (_._1).map (e => (e._1, e._2.size))
res198: scala.collection.immutable.Map[String,Int] = Map(2 -> 2, 1 -> 3)

Imho,我们需要一个groupBy来指定要分组的内容,并按分组计算。

答案 1 :(得分:1)

完成火花REPL。 test.txt是包含您提供的文本的文件

val d = sc.textFile("test.txt")
d.map(x => (x.split("\\|")(0), x.split("\\|")(1))).distinct.countByKey

scala.collection.Map[String,Long] = Map(2 -> 2, 1 -> 3)