spark编程基础--5.1RDD编程基础

RDD创建

1.从文件系统中加载数据创建RDD

2.从分布式文件系统HDFS中加载数据

 

3.通过并行集合(数组)创建RDD

 

RDD操作

1.转换操作

filter(func)

 

map(func)

flatmap(func)

groupByKey()

 

reduceByKey(func)

2.行动操作

3.惰性机制

所谓的惰性机制是指,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会触发从头到尾的真正的计算。这里给出一段简单的语句来解释Spark的惰性机制。

 

 

分区

1创建RDD时手动指定分区个数

在调用textFile()parallelize()方法的时候手动指定分区个数即可,语法格式如下:

sc.textFile(path, partitionNum)

其中,path参数用于指定要加载的文件的地址,partitionNum参数用于指定分区个数。

2使用reparititon方法重新设置分区个数

自定义分区方法

实例:根据key值的最后一位数字,写到不同的文件

例如:

10写入到part-00000

11写入到part-00001

.

.

19写入到part-00009

import org.apache.spark.{Partitioner, SparkContext, SparkConf}
//自定义分区类,需要继承org.apache.spark.Partitioner类
class MyPartitioner(numParts:Int) extends Partitioner{
  //覆盖分区数
  override def numPartitions: Int = numParts 
  //覆盖分区号获取函数
  override def getPartition(key: Any): Int = {
    key.toString.toInt%10
}
}
object TestPartitioner {
  def main(args: Array[String]) {
    val conf=new SparkConf()
    val sc=new SparkContext(conf)
    //模拟5个分区的数据
    val data=sc.parallelize(1 to 10,5)
    //根据尾号转变为10个分区,分别写到10个文件
    data.map((_,1)).partitionBy(new MyPartitioner(10)).map(_._1).saveAsTextFile("file:///usr/local/spark/mycode/rdd/partitioner")
  }
} 

注意:这里的partitioner不需要自己提前创建好,否则会运行不成功。

 

sbt编译打包,spark-submit提交执行

 

 

一个综合实例

假设有一个本地文件word.txt,里面包含了很多行文本,每行文本由多个单词构成,单词之间用空格分隔。可以使用如下语句进行词频统计(即统计每个单词出现的次数):

scala> val  lines = sc.         //代码一行放不下,可以在圆点后回车,在下行继续输入
|  textFile("file:///usr/local/spark/mycode/wordcount/word.txt")
scala> val wordCount = lines.flatMap(line => line.split(" ")).
|  map(word => (word, 1)).reduceByKey((a, b) => a + b)
scala> wordCount.collect()
scala> wordCount.foreach(println)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值