RDD转DF的两种方式

1.第一种方式:

首先我们展示一下数据文件:

Michael, 29
Andy, 30
Justin, 19

然后我们开始编写第一种实现方法:
先写一个case calss,然后再map方式将数据转换成people形式通过toDF直接转换

def run1(sparkSession: SparkSession): Unit = {
		//隐式转换
	import sparkSession.implicits._
		//接收文件,是rdd类型
      val rdd: RDD[String] = sparkSession.sparkContext.textFile("data/people.txt")
      //根据逗号进行分割,将字段赋值给people
      val df: DataFrame = rdd.map(_.split(","))
      .map(x => people(x(0), x(1).trim.toInt))
      //直接todf
      .toDF()
      df.show()
    }
    case class people(name:String,age:Int)

编main方法进行测试:

def main(args: Array[String]): Unit = {

    val sparkSession = new sql.SparkSession.Builder().master("local").appName("InteroperatingWithRDDApp").getOrCreate()
    
    run1(sparkSession)

    sparkSession.stop()
    

运行结果:
RDD转DF的两种方式_第1张图片

2.第二种方式:

当不能实现定义case class时,我们就要使用第二种方法,这个方法分三步骤
1.从原始数据里创建一个row类型的rdd
2.使用StruTpye创建一个Schema信息
3.使用createDateFrame方法将rdd和Schema作用起来

def run2(sparkSession: SparkSession)={
		//隐式转换
      import sparkSession.implicits._
      
      import org.apache.spark.sql.types._
      //接收数据
      val rdd: RDD[String] = sparkSession.sparkContext.textFile("data/people.txt")
      //第一步:将string类型的rdd转换成row类型的rdd
      val row: RDD[Row] = rdd.map(_.split(","))
      	.map(x => Row(x(0), x(1).trim.toInt))

		//第二部:使用StructType 创建一个schema信息
      val struct: StructType = StructType(
      	//StructType里放StructField,有三个参数
      	//1.字段名
      	//2.type类型的字段类型
      	//3.是否为空
        StructField("name", StringType, false) ::
          StructField("age", IntegerType, true) :: Nil
      )
      //第三部结合一二两步
      val df: DataFrame = sparkSession.createDataFrame(row, struct)
      df.show()
    }

测试:
RDD转DF的两种方式_第2张图片
当然我们可以用这种方式将df转成ds,但要创建一个case class:

val ds: Dataset[people] = df.as[people]

你可能感兴趣的:(学习,#,Spark)