最近正在看《Spark大数据处理:技术、应用与性能优化》这本书,然后对于最后一章的编程实战比较感兴趣。但是上面写的算法个人觉得还不是很简洁,无法体现出scala的优点,所以稍作了一些修改,仅供参考。
假设HDFS只存储一个标号为ID的Block,每份数据保存2个备份,这样就有2个机器存储
了相同的数据。 其中ID是小于10亿的整数。
若有一个数据块丢失,则需要找到哪个是丢失的
数据块。
在某个时间,如果得到一个数据块ID的列表,能否快速地找到这个表中仅出现一次的
ID?即快速找出出现故障的数据块的ID。
问题阐述:已知一个数组,数组中只有一个数据是出现一遍的,其他数据都是出现两
遍,将出现一次的数据找出。
1.实例描述
输入为Block ID。
1、 2、 2、 3、 3、 1、 5、 7、 11……
输出为:
100
2.设计思路
利用异或运算将列表中的所有ID异或,之后得到的值即为所求ID。 先将每个分区的数据
异或,然后将结果进行异或运算
代码实现:
import org.apache.spark.{SparkConf, SparkContext}
object CountOnce {
def main(arg: Array[String]):Unit={
val conf = new SparkConf().setAppName("countonce").setMaster("local")
val sc = new SparkContext(conf)
val dataRDD = sc.textFile("./data/countonce.txt")
.flatMap(_.split(" ")).map(x => x.toInt)
dataRDD.foreach(println)
//利用异或的数据,将数据转换成二进制形式,从低位对齐
// 1 1 1 7
// 1 1 1 7
//
// 0 0 0 0 :异或的结果
//-----------------------
// 1 1 1 7
// 1 0 0 4
// 1 1 1 7
//
// 1 0 0 4 :异或的结果
//所以此方法可以找出只出现一次或者是出现奇数次的数据
val result = dataRDD.reduce(_^_)
println(result)
}
}