spark:学习杂记+如何求丢失的数据例子--25

来源:互联网 发布:淘宝店没流量 编辑:程序博客网 时间:2024/05/22 00:57

列表的使用:

1.计算长度.length            scala> list(1, 2, 3).length          res: Int = 3

2.init方法:返回除了最后一个元素之外余下的列表

3.last方法:返回列表的最后一个元素

4.reverse方法:反转列表

5.前缀与后缀:

    take方法:返回列表前2个元素

    drop方法:返回列表从第X元素的列表

6.apply方法:实现了随机元素的选择

7.indices方法:返回指定列表的所有有效索引值组成的列表

    scala> abcde.indices

    res: List[Int] = List(0, 1, 2, 3, 4)

8.啮合列表:zip,操作可以把两个列表组成一个对偶列表

scala> abcde.indices zip abcderes: List[(Int, char)] = List((0, a),(1, b),(2, c),(3, d),(4, e))
  若长度不匹配的元素将被丢掉

9.toString返回列表的标准字符串表达形式

10.xs mkString (pre, sep, post)

      待显示的列表XS,需要显示在所有元素之前的前缀字符串pre,需要显示在每两个元素之间的分隔字符字符串sep,显示在最后面的字符串post

11.

scala> val buf = new StringBuilderbuf: StringBuilder = scala> abcde add String(buf, "(", ";", ")")res: StringBuilder = (a;b;c;d;e)
12.转换列表:toArray,toString,toList

13.elements方法:用枚举器访问列表元素

scala> val it = abcde.elementsit: Interator[char] = non-empty iteratorscala> it.nextres: char = ascala> it nextres: char = b
14.列表间映射:map,flatMmp,foreach

    flatMap操作符与Map类似,不过它的右操作元能够返回元素列表的函数

    Map返回的是包含列表的列表。而flatMap返回是把所有元素列表链接以后的单个列表

15.列表过滤:filter,partition,find,takewhile,dropwhile,span

    filter:产生结果为true的结果

    partition与filter功能相似但返回列表对

    find:返回第一个满足限制的元素,而非全部

    takewhile:返回符合条件的前缀集合

    dropwhile:返回不满足条件的前缀集合

16.列表的论断:forall和exists

    forall:如果列表所有元素满足约束条件P,返回true

    exists:如果列表只要有一个元素满足约束条件P,返回true

17.折叠列表: /:和:\

                            op

                          /      \

                       op      c

                     /      \

                  op        b

                /     \

             z         a

           op(op(op(z, a),b),c)

scala> def sum(xs: List[Int]): Int = (z /: xs)(_ + _)sum: (List[Int])Intres: z + a + b + c
18.列表排序:sort

scala> List(1, -3, 4, 2, 6) sort (_ < _)res: List[Int] = List(-3, 1, 2, 4, 6)//scala> words sort (_.length > _.length)res: List[java.lang.String] = List(quick, brown, fox, the)
19.通过元素创建列表:List.apply

scala> List.apply(1, 2, 3)res: List[Int] = List(1, 2, 3)
20.创建数值范围:List.range

scala> List.range(1, 5)res: List[Int] = List(1, 2, 3, 4)scala> List.range(1, 9, 2)res: List[Int] = List(1, 3, 5, 7)
21.创建统一列表:List.make

scala> List.make(5, 'a')res: List[char] = List (a, a, a, a, a)
22.解除啮合列表:List.unzip

scala> val zipped = "abcde".toList zip List(1, 2, 3)zipped: list[(Char, Int)] = List((a, 1),(b, 2),(c, 3))scala> List.unzip(zipped)res: (List[Char], List[Int]) = (List(a, b, c),List(1, 2, 3))
23.链接列表:flatten方法

scala> val xss = List(List('a','b'),List('c'),List('d','e'))xss: List[List[Char]] = List(List(a, b),List(c),List(d, e))scala> List.flatten(xss)res: List[Char] = List(a, b, c, d, e)
24.concat方法与flatten类似,能够连接多个元素列表,将多个列表以重复参数的形式直接传递给方法

25.映射及测试配对列表:List.map2,List.forall2,list.exists2

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

假设每份数据保存2个备份,这样就有2个机器存储了相同的数据,若一个数据丢失则需要找到哪个是丢失的数据

例如:输入ID: 1,1,3,4,6,7,4,3,7······

            输出:6

            用异或运算将列表中所有ID异或,得到的值即为所求ID,先将每个分区的数据异或再将结果进行异或

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package kjgimport org.apache.log4j.{Level, Logger}import org.apache.spark.{SparkContext, SparkConf}import org.apache.spark.SparkContext._import scala.collection.mutable.ListBuffer/** * Created by sendoh on 2015/4/14. */object NumOnce {  def main(args: Array[String]): Unit ={    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)    if(args.length != 3){      println("Usage: java -jar code.jar dependency_jars file_locaion save_location")      System.exit(0)    }    val jars = ListBuffer[String]()    args(0).split(',').map(jars += _)    //    val conf = new SparkConf().setAppName("NumOnce").setMaster("local[2]").setSparkHome("/usr/local/spark-1.2.0-bin-hadoop2.4").setJars(jars)    val sc = new SparkContext(conf)    //每个分区分别对数据进行异或运算,最后在reduceByKey阶段,将各分区异或运算的结果再做异或运算合并,偶数次出现的数字异或运算之后为0,奇数次出现的数字异或后为数字本身    val data = sc.textFile("hdfs://localhost:9000/datatnt/textworde.txt")    val result = data.mapPartitions(iter => {      var temp = iter.next()      while(iter.hasNext){        temp = temp ^ iter.next()      }      Seq((1, temp)).iterator    }).reduceByKey(_ ^ _).collect()    println("num appear once is :" + result(0))  }}


0 0
原创粉丝点击