【Spark】RDD创建总结

方式一、从内存中创建

1.makeRDD

scala> val df = sc.makeRDD(List("huangmouren","henshuai"))
df: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[66] at makeRDD at <console>:27

2.parallelize

scala> val dc = sc.parallelize(List("huangmouren","henshuai"),2)
dc: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[67] at parallelize at <console>:27

scala> dc.partition
partitioner   partitions

scala> dc.partitions.size
res16: Int = 2

区别:makeRDD函数有两种实现,第一种实现其实完全和parallelize一致;而第二种实现可以为数据提供位置信息 区别详解

方式二、从文件系统创建

1.textFile

支持本地文件系统,HDFS, S3等(file:// hdfs:// s3n://);
textFile支持在目录,压缩文件和通配符上运行。例如,你可以使用textFile("/my/directory"),textFile("/my/directory/.txt")和textFile("/my/directory/.gz")。
该textFile方法还采用可选的第二个参数来控制文件的分区数。默认情况下,Spark为文件的每个块创建一个分区(HDFS中默认为128MB),但您也可以通过传递更大的值来请求更多的分区。请注意,您不能拥有比块少的分区。

val rdd3 = sc.textFile("hdfs://192.168.56.122:9000/data/e")

2.wholeTextFiles

与textFile区别为:返回文件名和内容 键值对RDD,其它一样

val rdd4 = sc.wholeTextFiles("hdfs://192.168.56.122:9000/data/e")

3.sequenceFile

读取sequenceFile文件,其中K和V是文件中键和值的类型。这些应该是Hadoop的Writable接口的子类

sc.parallelize(Array("one","two","three")).map((_,1)).repartition(1).saveAsSequenceFile("hdfs://192.168.56.122:9000/data/e")
// SequenceFile 文件读取 Linux读取直接乱码 cat 读取需要使用 -text
[root@hw1 e]# hdfs dfs -text /data/e/part-00000

4、saveAsHadoopFile

saveAsHadoopFile是将RDD存储在HDFS上的文件中,支持老版本Hadoop API。
可以指定outputKeyClass、outputValueClass以及压缩格式。
每个分区输出一个文件。

scala> import org.apache.hadoop.io.Text
scala> import org.apache.hadoop.io.IntWritable
scala> import org.apache.hadoop.mapred.Text
scala> import org.apache.hadoop.mapred.TextOutputFormat
scala> sc.parallelize(Array("one","two","three")).map((_,1)).repartition(1).saveAsHadoopFile("/data/j",classOf[Text],classOf[IntWritable],classOf[TextOutputFormat[Text,IntWritable]])

5.newAPIHadoopRDD

方法采用任意JobConf输入格式类,键类和值类。设置这些与使用输入源的Hadoop作业的方式相同.读hbase如下

    val hconf: Configuration = HBaseConfiguration.create
    hconf.set("hbase.zookeeper.quorum", "xxx:2181,xxx:2181,xxx:2181")
    hconf.set(TableInputFormat.INPUT_TABLE, "xxx")
    hconf.set(TableInputFormat.SCAN_COLUMNS, "fields:phone_no fields:contacts_list")
    /*        hconf.set(TableInputFormat.SCAN_ROW_START,"0");
    hconf.set(TableInputFormat.SCAN_ROW_STOP,"10000");*/
    val pairRdd = sc.newAPIHadoopRDD(hconf, classOf[TableInputFormat], classOf[ImmutableBytesWritable],classOf[Result])
    pairRdd.foreach(println)

完整代码如下

object CreateRDDFun {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("CreateRDDFun examples").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)

    /**
      * 1.从内存中创建:makeRDD和parallelize
      * 区别:makeRDD函数有两种实现,第一种实现其实完全和parallelize一致;而第二种实现可以为数据提供位置信息
      */
    create01(sc)
    create02(sc)

    /**
      * 2.从文件系统创建:textFile、wholeTextFiles、sequenceFile、newAPIHadoopRDD
      */
    create03(sc)
    create04(sc)
    create05(sc)
    create06(sc)

    sc.stop()
  }

  private def create01(sc: SparkContext): Unit = {
    val rdd = sc.parallelize(List("zhangsan", "lisi", "wangwu"))
    rdd.foreach(println)
  }

  private def create02(sc: SparkContext): Unit = {
    val rdd2 = sc.makeRDD(List("zhangsan", "lisi", "wangwu"))
    rdd2.foreach(println)
  }

  private def create03(sc: SparkContext): Unit = {
    // file://  hdfs:// s3n://
    val rdd3 = sc.textFile("file:///D:/github/SparkLearnExample/examples/src/main/resources/people.txt")
    rdd3.foreach(println)
  }

  private def create04(sc: SparkContext): Unit = {
    //返回文件名和内容 键值对RDD
    val rdd4 = sc.wholeTextFiles("file:///D:/github/SparkLearnExample/examples/src/main/resources")
    rdd4.foreach(println)
  }

  private def create05(sc: SparkContext): Unit = {
    //其中K和V是文件中键和值的类型
    val rdd5 = sc.sequenceFile("hdfs://xxx", classOf[Text], classOf[Text])
    rdd5.foreach(println)
  }

  private def create06(sc: SparkContext): Unit = {
    //方法采用任意JobConf输入格式类,键类和值类。设置这些与使用输入源的Hadoop作业的方式相同.
    //读hbase
    val hconf: Configuration = HBaseConfiguration.create
    hconf.set("hbase.zookeeper.quorum", "xxx:2181,xxx:2181,xxx:2181")
    hconf.set(TableInputFormat.INPUT_TABLE, "xxx")
    hconf.set(TableInputFormat.SCAN_COLUMNS, "fields:phone_no fields:contacts_list")
    /*        hconf.set(TableInputFormat.SCAN_ROW_START,"0");
            hconf.set(TableInputFormat.SCAN_ROW_STOP,"10000");*/
    val pairRdd = sc.newAPIHadoopRDD(hconf, classOf[TableInputFormat], classOf[ImmutableBytesWritable],classOf[Result])
    pairRdd.foreach(println)
  }
}

发布了94 篇原创文章 · 获赞 110 · 访问量 5055

猜你喜欢

转载自blog.csdn.net/beautiful_huang/article/details/103825569