scala知识点(一)

1.drop,dropRight,dropWhile

drop: drop(n: Int): List[A] 丢弃前n个元素,返回剩下的元素

dropRight: dropRight(n: Int): List[A] 丢弃最后n个元素,返回剩下的元素

dropWhile: dropWhile(p: (A) ⇒ Boolean): List[A] 从左向右丢弃元素,直到条件p不成立

1 val nums = List(1,1,1,1,4,4,4,4)
2 val left = nums.drop(4)   // List(4,4,4,4)
3 val right = nums.dropRight(4) // List(1,1,1,1)
4 val tailNums = nums.dropWhile( _ == nums.head)  // List(4,4,4,4)

还有更多的操作 http://blog.csdn.net/pzw_0612/article/details/45936165

2. GraphX 图数据建模和存储

原文: http://blog.csdn.net/pelick/article/details/47293495

(1)背景:简单分析一下GraphX是怎么为图数据建模和存储的。

(2)入口:可以看 GraphLoader 的函数,

1 def edgeListFile(
2   sc: SparkContext,
3   path: String,
4   canonicalOrientation: Boolean = false,
5   numEdgePartitions: Int = -1,
6   edgeStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY,
7   vertexStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY)
8 : Graph[Int, Int]

 path可以是本地路径(文件或文件夹),也可以是hdfs路径,本质上是使用 sc.textFile 来生成HadoopRDD的, numEdgePartitions 是分区数。
    Graph的存储是分EdgeRDD和VertexRDD两块,可以分别设置StorageLevel。默认是内存。
    这个函数接受边文件,即’1 2’, ‘4 1’这样的点到点的数据对组成的文件。把这份文件按分区数和存储level转化成一个可以操作的图。

(3)流程:

  • sc.textFile 读文件,生成原始的RDD
  • 每个分区(的计算节点)把每条记录放进 PrimitiveVector 里,这个结构是spark里为primitive数据优化的存储结构。
  • 把 PrimitiveVector 里的数据一条条取出,转化成 EdgePartition ,即 EdgeRDD 的分区实现。这个过程中生成了面向列存的结构:src点的array,dst点的array,edge的属性array,以及两个正反向map(用于对应点的local id和global id)。
  • 对 EdgeRDD 做一次count触发这次边建模任务,真正persist起来。
  • 用 EdgePartition 去生成一个 RoutingTablePartition ,里面是vertexId到partitionId的对应关系,借助 RoutingTablePartition 生成 VertexRDD 。
  • 由 EdgeRDD 和 VertexRDD 生成 Graph 。前者维护了边的属性、边两头顶点的属性、两头顶点各自的global vertexID、两头顶点各自的local Id(在一个edge分区里的array index)、用于寻址array的正反向map。后者维护了点存在于哪个边的分区上的Map。

以下是代码,比较清晰地展现了内部存储结构。

private[graphx]
class EdgePartition[
  @specialized(Char, Int, Boolean, Byte, Long, Float, Double) ED: ClassTag, VD: ClassTag](
  localSrcIds: Array[Int],
  localDstIds: Array[Int],
  data: Array[ED],
  index: GraphXPrimitiveKeyOpenHashMap[VertexId, Int],
  global2local: GraphXPrimitiveKeyOpenHashMap[VertexId, Int],
  local2global: Array[VertexId],
  vertexAttrs: Array[VD],
  activeSet: Option[VertexSet])
  extends Serializable {

/**
 * Stores the locations of edge-partition join sites for each vertex attribute in a particular
 * vertex partition. This provides routing information for shipping vertex attributes to edge
 * partitions.
 */
private[graphx]
class RoutingTablePartition(
    private val routingTable: Array[(Array[VertexId], BitSet, BitSet)]) extends Serializable {

(4)GraphLoader:graphLoader是graphx中专门用于图的加载和生成,最重要的函数就是edgeListFile

(5)IllegalArgumentException此异常表明向方法传递了一个不合法或不正确的参数。

(6)GraphX提供了ConnectedComponents和StronglyConnected-Components算法,使用它们可以快速计算出相应的连通图

(7)val graph = GraphLoader.edgeListFile(sc, "/home/spark/spark/graphx/data/followers.txt")//加载边时顶点是边上出现的点

(8)val bobsScore = scores.getOrElse("Bob", 0) 检查是否包含指定的键。

时间: 2024-12-14 15:00:17

scala知识点(一)的相关文章

Scala知识点总结(上半部分)

深度解析Scala -----------语法精细篇 1.安装Scala: 1.将安装包解压 2.配置环境变量 E:\program\scala-2.11.8 系统变量中配置:变量名:SCAL_HOME 变量值:E:\program\scala-2.11.8 确定 编辑环境变量中:新建 ==>%SCALA_HOME%/bin===>确定 注意:如果在配置完了Scala,需要从新打开cmd.exe 2.配置IDEA 2.1点击Configure--->Plugins----->Ins

Scala知识点

1)将Array转化为String,toStrings()方法应该是序列化了的. scala> val args = Array("Hello", "world", "it's", "me") args: Array[java.lang.String] = Array(Hello, world, it's, me) scala> val string = args.mkString(" ") s

scala知识点(二)

1.正则表达式: 与正则表达式相关的类是scala.util.matching.Regex类,要构造一个Regex对象,使用String类的r方法即可,如果正则表达式中包含反斜杠或引号之类的需要转义的字符,那么最好是使用原始(raw)字符串,以三个”号包围 val apacheLogRegex = """^([\d.]+) (\S+) (\S+) \[([\w\d:/]+\s[+\-]\d{4})\] "(.+?)" (\d{3}) ([\d\-]+) &

Scala琐碎知识点

tuple scala中的tuple数据结构,是用来包含不同数据类型的容器,定义如下: 访问tuple中的元素,需要使用._n的语法,索引从1开始: scala中的tuple的长度最多为22,超过22报错: 上述定义scala中的tuple的方式是下面这种方式的缩写: scala中的cons(:: 和 :::  ) 首先要知道在Scala中Nil代表的是空的列表List cons定义: x :: xs 如下就是把一个Int类型添加到Int类型的List中 ::: 这个运算符在scala中表示的是

关于Scala的知识点(一)

Scala的概念: Scala是一个面向对象和面向函数式的多范式编程语言,基于JVM,运行于Java虚拟机,兼容现有Java程序. 在Scala编程中,“每个值都是对象,每个符号都是方法操作”. 在面向函数中,函数是一个对象.他跟字符串.数值具有同等地位,也就是说函数可以赋值给一个变量,可以作为方法的参数,可以作为方法的返回值.函数操作在程序中是一个输入到输出的映射关系.输入参数不可变是函数式编程的基石. "函数式编程"是一种"编程范式"(programming p

scala的object知识点

1:object的中的代码,会在object对象被调用的时候执行且只会执行一次 object Demo{ println("gaoxing") def name = "nihao" } object Test extends App{ println(3) print(Demo.name) print(Demo.name) print(Demo.name) }

【Scala】Scala之Classes and Properties

一.前言 前面学习了控制结构,下面学习Scala的Class和Properties. 二.Class&Properties 尽管Scala和Java很类似,但是对类的定义.类构造函数.字段可见性控制等则不相同,Java更为冗长,Scala精炼.本章将通过Scala的构造函数工作原理来理解Scala的类和字段,当申明类构造函数参数和使用var.val.private关键字来修饰类的字段时,Scala编译器将会为你生成代码,根据字段修饰符不同,Scala编译器会生成不同的存取函数,本章也会展示如何重

Scala

Scala 一.前言 大数据领域的Spark.Kafka.Summingbird等都是由Scala语言编写而成,相比Java而言,Scala更精炼.由于笔者从事大数据相关的工作,所以有必要好好学习Scala语言,之前也学习过,但是没有记录,所以就会忘记,感觉Scala确实比Java方便精炼很多,下面以Scala Cookbook英文版作为参考资料,从头到尾梳理Scala相关知识点,也加深印象.PS:这是在研究Zookeeper源码的间隙中交叉学习,不至于总是看源码太枯燥. 二.String 在S

第3课 Scala函数式编程彻底精通及Spark源码阅读笔记

本课内容: 1:scala中函数式编程彻底详解 2:Spark源码中的scala函数式编程 3:案例和作业 函数式编程开始: def fun1(name: String){ println(name) } //将函数名赋值给一个变量,那么这个变量就是一个函数了. val fun1_v = fun1_ 访问 fun1_v("Scala") 结果:Scala 匿名函数:参数名称用 => 指向函数体 val fun2=(content: String) => println(co