Spark RDD DataSet 和 DataFrame之间的相互转换

package com.spark.sql

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql._


object Rdd2DataFrame {

  System.setProperty("hadoop.home.dir", "d://soft/hadoop/hadoop-2.9.2")

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().master("local").appName("rdd2dataframe").getOrCreate()
    val lineRdd = spark.sparkContext.textFile("G:\\people.txt")

    //1.RDD----->DataFrame
        val df = rdd2DataFrame(lineRdd, spark)
    //2.DataFrame--->RDD
        dataFrame2Rdd(df)
    //3.RDD---->DataSet
        val ds = rdd2Dataset(lineRdd, spark)
    // 4.DataSet---->RDD
        dataset2Rdd(ds)
    //5. DataFrame---->DataSet
        val ds1 = dataFrame2Dataset(df)
    //6. DataSet----->DataFrame
        dataset2DataFrame(ds1)

    spark.close()
  }

  //1.RDD----->DataFrame
  def rdd2DataFrame(lineRdd: RDD[String], spark: SparkSession): DataFrame = {

    // 方式一:动态编程方式
    //        val personRDD = lineRdd.map(line => Row(line.split(" ")(0), line.split(" ")(1).toInt))
    //        val fields = Seq(StructField("name", StringType), StructField("age", IntegerType))
    //        val schema = StructType(fields)
    //        val personDF = spark.createDataFrame(personRdd, schema)
    //
    //        personDF.show()

    //方式二:反射方式类型推断  (case class Persons(name:String, age:Int))
    //(1) 使用类来反射字段名称
    //    val personRdd = lineRdd.map(line => Persons(line.split(" ")(0), line.split(" ")(1).toInt))
    //    import spark.implicits._
    //    val personDF = personRdd.toDF

    //(2)不使用类  直接起列名
    val personRDD = lineRdd.map(line => (line.split(" ")(0), line.split(" ")(1).toInt))
    import spark.implicits._
    val personDF = personRDD.toDF("name", "age")

    personDF.show()
    //返回值
    personDF

  }

  //2.DataFrame--->RDD
  def dataFrame2Rdd(df: DataFrame): Unit = {
    val rdd = df.rdd
    rdd.foreach(println)
  }

  //3.RDD---->DataSet
  def rdd2Dataset(lineRdd: RDD[String], spark: SparkSession): Dataset[Person] = {
    import spark.implicits._
    //    val df = List(1,2,3,4,5).toDF("num")
    //    val ds: Dataset[Int] = List(1,2,3,4,5).toDS()

    val personRdd = lineRdd.map(line => Person(line.split(" ")(0), line.split(" ")(1).toInt))

    //kyro序列化方式
    //    implicit val personEncoder = org.apache.spark.sql.Encoders.kryo[Person]
    //Encoder进行序列化(SparkSQL推荐使用的方式)
    //    implicit val personEncoder: Encoder[Person] = ExpressionEncoder()
    //    val personDS = spark.createDataset(personRdd)

    val personDS = personRdd.toDS()
    personDS.filter(p => p.age > 20).show()

    personDS.show()
    personDS
  }

  // 4.DataSet---->RDD
  def dataset2Rdd(ds: Dataset[Person]): Unit = {
    val rdd = ds.rdd
    rdd.foreach(println)
  }

  //5. DataFrame---->DataSet
  def dataFrame2Dataset(df: DataFrame): Dataset[Person] = {
    implicit val personEncoder: Encoder[Person] = ExpressionEncoder()
    val personDS = df.as[Person]
    personDS.show()
    personDS
  }
  //6. DataSet----->DataFrame
  def dataset2DataFrame(ds: Dataset[Person]): Unit = {
    val df = ds.toDF("name", "age")
    df.show()
  }

}

case class Persons(name: String, age: Int)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RDDDataFrameDataSetSpark中常用的数据结构,它们之间可以相互转换。 1. RDDDataFrame 可以通过SparkSession的createDataFrame方法将RDD转换DataFrame,需要指定DataFrame的schema。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("RDD to DataFrame").getOrCreate() rdd = spark.sparkContext.parallelize([(1, "Alice"), (2, "Bob"), (3, "Charlie")]) schema = StructType([ StructField("id", IntegerType(), True), StructField("name", StringType(), True) ]) df = spark.createDataFrame(rdd, schema) df.show() ``` 2. DataFrameRDD 可以通过DataFramerdd方法将DataFrame转换RDD。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("DataFrame to RDD").getOrCreate() data = [(1, "Alice"), (2, "Bob"), (3, "Charlie")] df = spark.createDataFrame(data, ["id", "name"]) rdd = df.rdd rdd.foreach(print) ``` 3. DataFrameDataSet 可以通过as方法将DataFrame转换DataSet。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("DataFrame to DataSet").getOrCreate() data = [(1, "Alice"), (2, "Bob"), (3, "Charlie")] df = spark.createDataFrame(data, ["id", "name"]) ds = df.as[(int, str)] ds.show() ``` 4. DataSetDataFrame 可以通过toDF方法将DataSet转换DataFrame。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("DataSet to DataFrame").getOrCreate() data = [(1, "Alice"), (2, "Bob"), (3, "Charlie")] ds = spark.createDataFrame(data, ["id", "name"]).as[(int, str)] df = ds.toDF() df.show() ``` 总之,Spark中的RDDDataFrameDataSet可以相互转换,根据实际需求选择合适的数据结构进行操作。 ### 回答2: Spark是一个分布式计算框架,支持多种数据处理模式,包括批处理、流处理和交互式查询。其中,RDDDataFrameDataSet是三种常用的数据结构,在Spark中处理复杂数据具有重要意义。下面,我们将会介绍在SparkRDDDataFrameDataSet之间的互相转换。 1. RDDDataFrame转换 RDDDataFrame转换Spark中最基本也是最常用的转换之一。这种转换很简单,只需在DataFrame对象上调用 rdd() 方法即可将DataFrame转换RDD对象。同样地,可以通过将RDD对象传递给SparkSession对象的 createDataFrame()方法来将RDD转换DataFrame。下面是一些代码样例: #将DataFrame转换RDD df.rdd() #将RDD转换DataFrame spark.createDataFrame(rdd) 2. RDDDataSet转换 RDDDataSet转换可以通过使用rdd()方法来实现,该方法将RDD转换DataSet。另外,还可以使用SparkSession的createDataset()方法,该方法可以将RDD转换DataSet。具体例如下: #将RDD转换Dataset val ds = spark.createDataset(rdd) #将Dataset转换RDD val rdd = ds.rdd 3. DataFrameDataSet转换 DataFrameDataset之间转换Spark中比较复杂和繁琐的一个转换,因为DataFrameDataSet在实现方面存在相当大的差异。幸运的是Spark提供了一些内置的方法,可以帮助我们在DataFrameDataSet之间进行转换。可以使用SparkSession的createDataFrame()方法将DataSet转换DataFrame,可以使用as()方法将DataFrame转换DataSet。例如,可以使用以下代码将DataFrameDataSet进行转换: #将DataFrame转换Dataset val ds = df.as[(String, Int)] #将Dataset转换DataFrame val df = ds.toDF() 总结: 由于Spark的各种数据类型和函数都可以在Scala、Java和Python中使用,因此数据转换的方法基本相同。在使用这些转换时,需要明确数据类型差异、转换函数及其语法、转换后数据的属性才能更好地利用大数据为业务赋能。以上就是RDDDataFrameDataSet之间的互相转换的一些基本介绍,通过这些转换可以灵活、高效地处理不同类型的数据,最终实现大数据分析和处理的目的。 ### 回答3: Spark是一个分布式计算引擎,支持基于内存的数据操作和高度可扩展的并行处理,它提供了强大的API来操作不同类型的数据集,其中包括RDDDataFrameDataSetRDD(Resilient Distributed Dataset)是Spark中的一个分布式计算模型,它是一个不可变的分布式对象集合,可以被分区,存储在集群节点上。RDD可以通过Transformation和Action操作来进行计算。 DataFrameSpark SQL中的一个数据结构,它是一种分布式的表,可以表示为行和列的数据结构,相对于RDD来说,DataFrame添加了模式信息和优化能力。 DataSetSpark 2.0中的一个新的API,是DataFrame的类型安全的版本。DataSet提供了静态类型检查和lambda表达式的功能,并通过在编译时检查类型优化查询执行。 在Spark中,RDDDataFrameDataSet之间可以互相转换: 1. RDD转换DataFrameDataSetRDD可以通过使用Spark SQL中的toDF方法转换DataFrame,此时RDD的元素需要是Row类型。如果需要将RDD转换DataSet,可以使用case class定义类来表示RDD中的元素,并使用Spark Session的createDataset方法来创建DataSet。 2. DataFrame转换RDDDataSetDataFrame可以通过使用rdd方法转换RDD,此时DataFrame的每一行都被转换成了一个标准的Scala对象。如果需要将DataFrame转换DataSet,可以使用as方法将DataFrame转换DataSet。 3. DataSet转换RDDDataFrameDataSet可以通过使用rdd方法转换RDD,此时DataSet的每一行都被转换成了一个标准的Scala对象。如果需要将DataSet转换DataFrame,可以使用toDF方法将DataSet转换DataFrame。 总之,在Spark中,RDDDataFrameDataSet之间可以实现互相转换,开发者可以根据自己的需求选择最适合自己的数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值