Scala 数据流上的combineByKey抛出错误

Scala 数据流上的combineByKey抛出错误,scala,spark-streaming,rdd,dstream,Scala,Spark Streaming,Rdd,Dstream,我有一个数据流,其中包含元组(String,Int) 当我尝试combineByKey时,它告诉我指定参数:Partitioner 但是,当我在rdd上使用它时,它工作正常: my_dstream.foreachRDD( rdd => rdd.combineByKey( (v) => (v,1), (acc:(Int, Int), v) => (acc._1 + v, acc._2 + 1), (acc1:(Int,

我有一个数据流,其中包含元组
(String,Int)

当我尝试
combineByKey
时,它告诉我指定参数:Partitioner

但是,当我在rdd上使用它时,它工作正常:

 my_dstream.foreachRDD( rdd =>
      rdd.combineByKey(
        (v) => (v,1),
        (acc:(Int, Int), v) => (acc._1 + v, acc._2 + 1),
        (acc1:(Int, Int), acc2:(Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2)
      ))
我在哪里可以买到这个分割器

我在哪里可以买到这个分割器

你可以自己创造它。火花从盒子里出来,有两个分割器:和。默认值是前者。您可以通过它的构造函数进行实例化,您需要传递所需分区的数量:

val numOfPartitions = // specify the amount you want
val hashPartitioner = new HashPartitioner(numOfPartitions)

my_dstream.combineByKey(
  (v) => (v,1),
  (acc:(Int, Int), v) => (acc._1 + v, acc._2 + 1),
  (acc1:(Int, Int), acc2:(Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2), 
                                        hashPartitioner
) 

附带问题:您为什么要这样做而不是
dstream.map(e=>(e,1)).reduceByKey(+)
?具体来说,我想计算按键分组的多个值。所以我需要使用
combineByKey
而不是
reduceByKey
我不知道应该使用多少分区。所以:1)我可以避免在数据流上使用分区器吗?2) 如果没有,我应该根据什么选择分区数?@Vadym没有,你不能避免分区器。对如何划分数据有一个大致的了解
val numOfPartitions = // specify the amount you want
val hashPartitioner = new HashPartitioner(numOfPartitions)

my_dstream.combineByKey(
  (v) => (v,1),
  (acc:(Int, Int), v) => (acc._1 + v, acc._2 + 1),
  (acc1:(Int, Int), acc2:(Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2), 
                                        hashPartitioner
)