spark 之如何创建空的RDD

spark 之如何创建空的RDD

1 创建没有分区的空 RDD

在 Spark 中,对 SparkContext 对象使用 emptyRDD() 函数会创建一个没有分区或元素的空 RDD。 下面的示例创建一个空 RDD。

In Spark, using emptyRDD() function on the SparkContext object creates an empty RDD with no partitions or elements. The below examples create an empty RDD.

 //创建一个空的RDD,数据类型未定
  val rdd: RDD[Nothing] = spark.sparkContext.emptyRDD
  //创建空rdd的第一种方式
  //创建一个空的RDD,数据类型为字符
  val rddstring: RDD[String] = spark.sparkContext.emptyRDD[String]
  println(rdd)
  println(rddstring)
  println("分区数为:" + rdd.getNumPartitions)
  //保存rdd
  rddstring.saveAsTextFile("data/output/text.txt")

2 创建一个带分区的空 RDD

使用 Spark sc.parallelize() 我们可以创建一个带有分区的空 RDD,将分区的 RDD 写入一个文件会导致创建多个部分文件

Using Spark sc.parallelize() we can create an empty RDD with partitions, writing partitioned RDD to a file results in the creation of multiple part files.

 //创建空RDD的第二种方式
  val rdd2: RDD[String] = spark.sparkContext.parallelize(Seq.empty[String])
  println(rdd2)
  println("分区数:" + rdd2.getNumPartitions)
  //可以定义多个数据类型,然后创建一个空的RDD

3 创建一个pair对 RDD

大多数我们使用带有pair的RDD,这里是另一个创建带有pair的RDD的例子。 此示例使用 String 和 Int 对创建一个空 RDD。

Most we use RDD with pair hence, here is another example of creating an RDD with pair. This example creates an empty RDD with String & Int pair.

type dataType = (String,Int)
  val pairrdd: RDD[(String, Int)] = spark.sparkContext.emptyRDD[dataType]
  println(pairrdd)

4 Java – 创建一个空的 RDD

与 Scala 类似,在 Java 中,我们也可以通过在 JavaSparkContext 对象上调用 emptyRDD() 函数来创建一个空 RDD。

Similar to Scala, In Java also we can create an empty RDD by call emptyRDD() function on JavaSparkContext object.

JavaSparkContext jsc;
// create java spark context and assign it to jsc object.
JavaRDD<T> emptyRDD = jsc.emptyRDD();

5 完整代码

package sparkbyexamples.RDD

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

/*
* App类是Scala自己提供的一个类,
* 它的作用是当object继承它时,
* 不需要写main方法,而是将整个的类看做一个main方法
* */
object CreateEmptyRDD extends App{
  private val spark: SparkSession = SparkSession.builder()
    .master("local")
    .appName("SparkByexamples")
    .getOrCreate()
  //创建一个空的RDD,数据类型未定
  val rdd: RDD[Nothing] = spark.sparkContext.emptyRDD
  //创建空rdd的第一种方式
  //创建一个空的RDD,数据类型为字符
  val rddstring: RDD[String] = spark.sparkContext.emptyRDD[String]
  println(rdd)
  println(rddstring)
  println("分区数为:" + rdd.getNumPartitions)
  //保存rdd
  rddstring.saveAsTextFile("data/output/text.txt")
  //创建空RDD的第二种方式
  val rdd2: RDD[String] = spark.sparkContext.parallelize(Seq.empty[String])
  println(rdd2)
  println("分区数:" + rdd2.getNumPartitions)
  //可以定义多个数据类型,然后创建一个空的RDD
  type dataType = (String,Int)
  val pairrdd: RDD[(String, Int)] = spark.sparkContext.emptyRDD[dataType]
  println(pairrdd)


}
运行结果:
EmptyRDD[0] at emptyRDD at CreateEmptyRDD.scala:17
EmptyRDD[1] at emptyRDD at CreateEmptyRDD.scala:18
分区数为:0
ParallelCollectionRDD[3] at parallelize at CreateEmptyRDD.scala:24
分区数:1
EmptyRDD[4] at emptyRDD at CreateEmptyRDD.scala:29

6 案例

package sparkbyexamples.RDD

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{Row, SparkSession}

object CreateRDD {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder()
      .master("local[*]")
      .appName("sparkbyexample")
      .getOrCreate()
    //使用parallelize创建rdd
    val rdd: RDD[(String, Int)] = spark.sparkContext.parallelize(Seq(("java",2000),("python",10000),("scala",300)))
    //遍历
    rdd.foreach(println)
    //从文件中建立rdd,textFile会将每一行数据作为一条记录
    val rdd1: RDD[String] = spark.sparkContext.textFile("InData/D02/wc.txt")
    ///wholeTextFiles会将文件路径作为key,内容作为整个value,也就是需要在后续处理时,自己手动划分
    val rdd2: RDD[(String, String)] = spark.sparkContext.wholeTextFiles("InData/D02/wc.txt")
    //按照文件内容遍历, record._1是拿到元组的第一个元素
    rdd2.foreach(record => println("FileNaem:" + record._1 + ",FileContents:" + record._2))
    //从现有的rdd通过变换,生成新的rdd
    val rdd3: RDD[(String, Int)] = rdd.map(row => {
      (row._1, row._2 + 100)
    })
    //通过dataframe转为rdd,toDF为转为dataframe数据结构
    val myRdd2: RDD[Row] = spark.range(20).toDF().rdd
    myRdd2.foreach(println)
  }


}

在本文中,您学习了如何在 Spark 中创建一个空 RDD,有分区,没有分区,最后是对 RDD。 希望它可以帮助你。

In this article, you have learned how to create an empty RDD in Spark with partition, no partition and finally with pair RDD. Hope it helps you.

你可能感兴趣的:(RDD,spark)