为什么count函数不能在Spark中使用mapvalues?

时间:2016-12-29 13:00:35

标签: apache-spark

我正在使用scala在spark中做一些基本的动手。

我想知道为什么count函数不能用于 mapValues map 函数

当我应用 sum,min,max 然后它可以工作..还有什么地方可以引用可以在groupbykeyRDD上应用于Iterable [String]的所有适用函数吗?

mycode的:

 Array((CHN,2) ,(BNG,2))

预期输出:

{{1}}

3 个答案:

答案 0 :(得分:1)

你遇到的错误与spark无关,这是一个纯粹的scala编译错误。

你可以尝试使用scala(根本没有火花)控制台:

scala> val iterableTest: Iterable[String] = Iterable("test")
iterableTest: Iterable[String] = List(test)

scala> iterableTest.count
<console>:29: error: missing argument list for method count in trait TraversableOnce

这是因为Iterable does not define a count (with no arguments) method。它确实定义了一个count方法,但它需要一个谓词函数参数,这就是为什么你得到关于部分未应用函数的特定错误。

它确实有一个size方法,您可以交换样本以使其正常工作。

答案 1 :(得分:1)

你得到的是类型Iteratable [String]然后尝试长度方法或大小方法因为Iteratable没有count方法,如果它不起作用 您可以将public void myFunction(final List<Long> l) { for (Long m:l){ if (m <= 900) { ... } else { } } } 转换为List并尝试长度方法

可用于RDD的计数方法

答案 2 :(得分:1)

count - 计算参数条件(布尔值)中提供的值的出现次数

使用您的代码计算: 此处计算出现次数为“2”,“3”

scala> groupbykeyRDD.collect().foreach(println)
(CHN,CompactBuffer(2, 3))
(BNG,CompactBuffer(2, 65))

scala> groupbykeyRDD.map(elem => (elem._1 ,elem._2.count(_ == "2"))).collect
res14: Array[(String, Int)] = Array((CHN,1), (BNG,1))

scala> groupbykeyRDD.map(elem => (elem._1 ,elem._2.count(_ == "3"))).collect
res15: Array[(String, Int)] = Array((CHN,1), (BNG,0))

count with with small fix to your code:如果你用这种方式扭曲你的代码而不是计数应该给你预期的结果:

val keyvalueRDD = mapRDD.map(elem => (elem(0),1))

<强> 测试:

scala> val groupbykeyRDD = mapRDD.map(elem => (elem(0),1)).groupByKey()
groupbykeyRDD: org.apache.spark.rdd.RDD[(String, Iterable[Int])] = ShuffledRDD[9] at groupByKey at <console>:18

scala> groupbykeyRDD.collect().foreach(println)
(CHN,CompactBuffer(1, 1))
(BNG,CompactBuffer(1, 1))

scala> groupbykeyRDD.map(elem => (elem._1 ,elem._2.count(_ == 1))).collect
res18: Array[(String, Int)] = Array((CHN,2), (BNG,2))