Arrays 使用ApacheSpark,如何计算Scala数组中每对的出现次数
我需要计算ScalaArrays 使用ApacheSpark,如何计算Scala数组中每对的出现次数,arrays,scala,apache-spark,Arrays,Scala,Apache Spark,我需要计算Scala数组中存在的每一对的出现次数,然后再分发一对。因此: 我必须统计集群节点的RDD上出现的每一对(即:“在分布式阵列的每一部分上”)。这意味着我将得到x个结果^1,其中x:我的群集节点数 然后,驱动程序必须将结果相加,以了解分布式数组每对的出现次数 ^1:请注意,一个结果是分布式阵列中每对自身部分的集群节点计数。我认为在那里使用HashMap就可以了。顺便说一下,驱动程序也将使用HashMap。驱动程序必须将其HashMap的每种情况与从集群节点接收的HashMap的相应情况相
数组中存在的每一对的出现次数,然后再分发一对。因此:
我必须统计集群节点的RDD
上出现的每一对(即:“在分布式阵列的每一部分上”)。这意味着我将得到x个结果^1,其中x:我的群集节点数
然后,驱动程序必须将结果相加,以了解分布式数组
每对的出现次数
^1:请注意,一个结果是分布式阵列
中每对自身部分的集群节点计数。我认为在那里使用HashMap
就可以了。顺便说一下,驱动程序也将使用HashMap
。驱动程序必须将其HashMap
的每种情况与从集群节点接收的HashMap
的相应情况相加
幻觉:
似乎您需要“reduceByKeyLocal”:
ReduceByKeyLocal首先本地映射,本地合并(使用foreachPartition)并调用reduce的操作来共享示例数据集和预期输出?当然!我只是加了一张图表来说明我的话。输入和输出数据集已给出。您能否不粘贴数据的附加图像,而是以可复制的格式粘贴代码和数据?代码非常基本:spark\u context.parallelize(my\u input\u dataset\u Array)。
我不知道在最后一点后放置什么。我知道我想做什么(参见我的图片),但不知道如何使用Spark来做。但我知道Spark正在工作以及一些子机制*我只是不知道如何实现我的目标。.map(colorPair=>(colorPair,1))
是增加出现次数,还是将其设置为1?如果给定节点有2个(“蓝色”、“红色”)
,则该节点的HashMap
中出现的次数必须为2。因此,您的指令中的“1”似乎是奇怪的否?这是一个经典的“字数”场景-它为每个元素创建JHashMap[K,V],并将它们合并,从而最终成为您想要的-(((“蓝色”、“红色”),n)抱歉没有回答您的问题,但您是正确的,“.map”part只是将每对设置为1根据文档,ReduceByKeyLocal/ReduceByToDriver
是一个简单的reduceByKey
,它向驱动程序返回一个Map
(这是唯一的区别)。那么,它是否执行隐式的collect
?*mapPartition—按照它所说的执行—在每个分区上应用map。这通常是处理本地资源所需的*reduce-实际上运行一个“reducePartition”作业它在每个分区上使用reduceLeft,并为合并所有结果的结果定义一个处理程序*reduceByKey-不是一个操作,为了在集群上完成合并结果,它需要洗牌-它的结果实际上是一个Shuffledd。希望这有帮助
val result: collection.Map[(String, String), Int] = context
.parallelize(Seq(("BLUE", "RED"), ("RED", "GREEN"), ("YELLOW", "ORANGE")))
.map(colorPair => (colorPair, 1))
.reduceByKeyLocally(_ + _)