Spark 基础 —— RDD(一)

1. Spark 为 RDD 提供的成员函数

  • .stats():包括(count:计数,mean:均值,stdev:标准差,max:最大,min:最小值)

  • countByValue:执行统计计数

    根据值统计出现的次数;

    scala> val animals = sc.parallelize(List("Dog", "Cat", "Tiger", "Cat"), 2)
    scala> animals.countByValue()
    scala.collection.Map[String,Long] = Map(Dog -> 1, Cat -> 2, Tiger -> 1)
    

    该成员函数更重要的意义在于,将数据从

    org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[8]
    

    类型变为了:

    scala.collection.Map[String,Long] = Map(Dog -> 1, Cat -> 2, Tiger -> 1)
    

2. 基本操作

val rawblocks = sc.textFile("linkage")
rawblocks
val head = rawblocks.take(10)
head.length
head.foreach(println)
					# 函数式编程
					# 将函数 println 作为参数传递给另一个函数以执行某个动作

声明函数

def isHeader(line: String) = line.contains("id_1")
					# 和 Python 类似,Scala 声明函数使用关键字 def
					# 和 Python 不同的是,我们必须为参数指定参数类型
					# 函数返回值无需指定类型,使用类型推断

有时候我们希望能显式地指明函数返回类型,特别是碰到函数体很长,代码复杂并且包含多个 return 语句的情况。这时,Scala 编译器不一定能推断出函数的返回类型,为了函数代码的可读性更好,也可以指明函数的返回类型。这样在阅读代码的时候,就不必重新把整个函数读一遍了。

def isHeader(line: String): Boolean = {
  line.contains("id_1");
}

通过用 Scala 的 Array 类的 filter 方法打印输出结果,可以在 head 数组上测试新编写的 Scala 函数:

head.filter(isHeader).foreach(println)
head.filterNot(isHeader).foreach(println)

还可以利用 Scala 对匿名函数的支持,在 filter 函数里面对 isHeader 函数取非:

head.filter(x => !isHeader(x)).foreach(println)

Scala 程序员最讨厌的就是键盘输入,因此 Scala 设计了许多小功能来减少输入,比如在匿名函数的定义中,为了定义匿名函数并给参数指定名称,只输入了字符 x => 。但像这么简单的匿名函数,甚至都没必要这么做:Scala 允许使用下划线_(正如 Python 迭代时,for _ in range(n))表示匿名函数的参数,也即这样:

head.filter(!isHeader(_)).foreach(println)

3. 用元组和 case class 对数据进行结构化

和 Python 一样,Scala 有内置 tuple 类型,可用于快速创建二元组,三元组和更多不同类型数值的集合,是一种表示记录的简单方法。

val line = head(5)
val pieces = line.split(',')

注意访问数组元素时用圆括号而不是方括号,Scala 语言访问数组元素是函数调用,不是什么特殊操作符。Scala 允许在类里定义一个特殊函数 apply,当把对象当作函数处理的时候,这个 apply 函数就会被调用,所以 head(5) 其实等价与 head.apply(5).

def toDouble(s: String) = {
  if ("?".equals(s)) Double.NaN else s.toDouble
}
def parse(line: String) = {
  val pieces = line.split(',')
  val id1 = pieces(0).toInt
  val id2 = pieces(1).toInt
  val scores = pieces.slice(2, 11).map(toDouble)
  val matched = pieces(11).toBoolean
  (id1, id2, scores, matched)
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值