RDD的创建

这一生的挚爱 提交于 2020-01-21 19:28:40

RDD有三种创建方式

1、从内存/集合中创建

val conf: SparkConf = new SparkConf().setAppName("test01").setMaster("local[*]")
val sc = new SparkContext(conf)
    
val rdd1: RDD[Int] = sc.parallelize(List(1, 2, 3, 4))

val rdd2: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))

注:

  • makeRDD和parallelize方法是一回事,makeRDD内部会调用parallelize方法。
  • parallelize和makeRDD还有一个重要的参数就是把数据集切分成的分区数
  • Spark会为每个分区运行一个任务(task),正常情况下,Spark会自动的根据你的集群来设置分区数

使用以上方法创建RDD时,可以指定分区数,如果不指定分区数,则按照创建创建conf里传入的setMaster()里的参数进行指定分区数。如果指定了分区数,则按照指定的分区数进行分区,分区规则如下:

    def positions(length: Long, numSlices: Int): Iterator[(Int, Int)] = {
      (0 until numSlices).iterator.map { i =>
        val start = ((i * length) / numSlices).toInt
        val end = (((i + 1) * length) / numSlices).toInt
        (start, end)
      }
    }

2、从外部存储创建RDD

val conf: SparkConf = new SparkConf().setAppName("test01").setMaster("local[*]")
val sc = new SparkContext(conf)

val line: RDD[String] = sc.textFile("inputFile")
line.saveAsTextFile("out")
  • url可以是本地文件系统文件, hdfs://..., s3n://...等等
  • 如果是使用的本地文件系统的路径, 则必须每个节点都要存在这个路径
  • 所有基于文件的方法, 都支持目录, 压缩文件, 和通配符(*). 例如: textFile("/my/directory"), textFile("/my/directory/*.txt"), and textFile("/my/directory/*.gz").
  • textFile还可以有第二个参数, 表示分区数. 默认情况下, 每个块对应一个分区.(对 HDFS 来说, 块大小默认是 128M). 可以传递一个大于块数的分区数, 但是不能传递一个比块数小的分区数.

textFile还可以传第二个参数,

def defaultMinPartitions: Int = math.min(defaultParallelism, 2)

此处的defaultParallelism也是conf中的指定的值。和makeRDD中一样。 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!