Spark——DataFrame与RDD互操作方式

一.引言

       Spark SQL支持两种不同的方法将现有RDD转换为数据集。

  1.第一种方法使用反射来推断包含特定类型对象的RDD的模式。这种基于反射的方法可以使代码更简洁,并且在编写Spark应用程序时已经了解了模式,因此可以很好地工作。详细资料参考  DataFrame与RDD互操作之反射

在开始之前现在项目的根路径下创建一个infos.txt文件,里面插入下面这种数据,以便进行学习
1,李国辉,26
2,华华,23
3,ligh,24

package com.spark

import org.apache.spark.sql.SparkSession

object DataFrameRDDAPP {

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

    val path="E:\\data\\infos.txt"
    val spark =SparkSession.builder().appName("DataFrameRDDAPP").master("local[2]").getOrCreate()

    //RDD==>DataFrame
    val rdd=spark.sparkContext.textFile(path)


    //注意导入隐式转换
    import spark.implicits._
    val infoDF=rdd.map(_.split(",")).map(line=>Info(line(0).toInt,line(1),line(2).toInt)).toDF()

    infoDF.show()
    infoDF.filter(infoDF.col("age")>19).show()

    infoDF.createOrReplaceTempView("infos")
    spark.sql("select *from infos where age>10").show()

    spark.stop()
  }

  case class Info(id:Int ,name:String ,age:Int)
}

  2.创建数据集的第二种方法是通过编程接口,允许您构建模式,然后将其应用于现有RDD。虽然此方法更详细,但它允许您在直到运行时才知道列及其类型时构造数据集。
  DataFrame则可以通过三个步骤以编程方式创建。

  1)Row从原始RDD 创建s的RDD;
  2)创建由StructType匹配Row步骤1中创建的RDD中的s 结构 表示的模式。
  3)Row通过createDataFrame提供的方法将模式应用于s 的RDD SparkSession。

package com.spark

import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{StringType, StructField, StructType}

/**
  * convert rdd to dataframe 2
  *
  * @param spark
  */

object DataFrameRDDAPP2 {

  val spark =SparkSession.builder().appName("DataFrameRDDAPP").master("local[2]").getOrCreate()
  // 1.转成RDD
  val rdd = spark.sparkContext.textFile("E:\\data\\spark\\infos.txt")

  // 2.定义schema,带有StructType的
  // 定义schema信息
  val schemaString = "name age"
  // 对schema信息按空格进行分割
  // 最终fileds里包含了2个StructField
  val fields = schemaString.split(" ")
    // 字段类型,字段名称判断是不是为空
    .map(fieldName => StructField(fieldName, StringType, nullable = true))
  val schema = StructType(fields)

  // 3.把我们的schema信息作用到RDD上
  //   这个RDD里面包含了一些行
  // 形成Row类型的RDD
  val rowRDD = rdd.map(_.split(","))
    .map(x => Row(x(1), x(2).trim))
  // 通过SparkSession创建一个DataFrame
  // 传进来一个rowRDD和schema,将schema作用到rowRDD上
  val peopleDF = spark.createDataFrame(rowRDD, schema)

  peopleDF.show()

}

 

posted @ 2019-01-24 19:08  夏延  阅读(342)  评论(0编辑  收藏  举报