分别用反射、编程接口的方式创建DataFrame

1、通过反射的方式 使用反射来推断包含特定数据类型的RDD,这种方式代码比较少,简洁,只要你会知道元数据信息时什么样,就可以使用了

代码如下:

import org.apache.spark.sql.{SQLContext, SaveMode}
import org.apache.spark.{SparkConf, SparkContext}

object RDD2DataFrame {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("DF").setMaster("local")
    val sc = new SparkContext(conf)
    val sQLContext = new SQLContext(sc)
    //创建一个普通的RDD
    val rdd = sc.textFile("D:\data\spark\students.txt")
   var rdd2= rdd.map(t=>{
      val lines = t.split(",")
      studented(lines(0).toInt,lines(1),lines(2).toInt)

    })
    //注意:需要导入隐式转换
    import sQLContext.implicits._
    val df = rdd2.toDF()
    //注册临时表
    df.registerTempTable("student")
    val dfs = sQLContext.sql("select name from student where age>18")
    dfs.write.mode(SaveMode.Append).text("D:\result\Rdd2DataFrame")

  }

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

  

2、通过编程接口的方式 你可以自己动态的构建一份元数据,这种代码比较多,但是适合你不知道元数据的时候使用,一般都用这种方式

代码如下:

object RDD2DataFrame2 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("df02").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    //val df = sqlContext.read.json("D:\data\spark\students.json")


   val rdd = sc.textFile("D:\data\spark\students.txt")
    val rowRdd = rdd.map(t => {
     val str = t.split(",")
      Row(str(0).toInt, str(1), str(2).toInt)
   })
    //构建StructType
    val structType = StructType(Array(StructField("id", IntegerType, true),
      StructField("name", StringType, true),
      StructField("age", IntegerType, true)
    ))
    //创建DataFrame
    val df: DataFrame = sqlContext.createDataFrame(rowRdd,structType)
    df.registerTempTable("stu")
    val sql = sqlContext.sql("select * from stu where age>17")
    sql.rdd.foreach(println)
  }
}

  

原文地址:https://www.cnblogs.com/zmoumou/p/9997148.html