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
)