我正在使用scala在spark中做一些基本的动手。
我想知道为什么count函数不能用于 mapValues 和 map 函数
当我应用 sum,min,max 然后它可以工作..还有什么地方可以引用可以在groupbykeyRDD上应用于Iterable [String]的所有适用函数吗?
mycode的:
Array((CHN,2) ,(BNG,2))
预期输出:
{{1}}
答案 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))