SparkSQL之创建DataFrame

来源:互联网 发布:淘宝在哪里看未认证 编辑:程序博客网 时间:2024/04/29 15:52
def main(args: Array[String]): Unit = {  val conf = new SparkConf().setMaster("local").setAppName("ScalaDataFrame")  val sc = new SparkContext(conf)  val sqlContext = new SQLContext(sc)  val listRDD = sc.parallelize(List("zhangsan 13 168.5", "lisi 14 175.3", "wangwu 15 176.3"))  //    createDataFrame_1(listRDD, sqlContext)  //    createDataFrame_2(listRDD, sqlContext)  //    createDataFrame_3(listRDD, sqlContext)  createDataFrame_4(listRDD, sqlContext)  sc.stop()}/**  * 将一个DataFrame注册成为一张临时表,在临时表上面执行sql的操作,方便我们的查询等操作  */def createDataFrame_4(listRDD: RDD[String], sqlContext: SQLContext) = {  /**    * 因为我们要使用sql的方式来操作SparkSQL对应的DataFrame    * 应该把该DataFrame转化成为一张表,所以需要注册该DataFrame成为系统中的一张临时表    */  val df = createDataFrame_3(listRDD, sqlContext)  df.registerTempTable("person")  /**    * 注册成为一张临时表之后,直接进行sql的操作,    * 使用SQLContext,而不是df进行操作    */  val sqlDF = sqlContext.sql("select name, age, height from person where age > 14")  sqlDF.show()}/**  * 使用SQLContext的隐士转化快速将一个RDD转化为一个DataFrame  */def createDataFrame_3(listRDD: RDD[String], sqlContext: SQLContext): DataFrame = {  import sqlContext.implicits._  //这个隐士转换必须要有  val rowRDD = listRDD.map(line => {    val splits = line.split(" ")    val name = splits(0).trim    val age = splits(1).trim.toInt    val height = splits(2).trim.toDouble    (name, age, height)  })  /**    * 第三中创建DataFrame的方式,使用sqlContext内部的一个隐士转换,    * 增强普通RDD的功能    * rdd.toDF(cols:String*)    * col是对该rdd中所包含的数据的一个说明,简单认为就是转化为DataFrame之后给每个列    * 起的一个列名    */  val df = rowRDD.toDF("name", "age", "height")  //    df.printSchema()  //    df.show()  df}def createDataFrame_2(listRDD: RDD[String], sqlContext: SQLContext): Unit = {  val personRDD: RDD[Person] = listRDD.map(line => {    val splits = line.split(" ")    val name = splits(0).trim    val age = splits(1).trim.toInt    val height = splits(2).trim.toDouble    new Person(name, age, height)  })  /**    * scala中通过反射的方式将一个RDD,转换为一个DataFrame    * java中获取一个类的字节码Class对象,直接类名.class    * scala中需要通过classOf[类名]的方法    */  val df = sqlContext.createDataFrame(personRDD, classOf[Person])  df.printSchema()  df.show()}/**  * 在代码中动态生成DataFrame  */def createDataFrame_1(listRDD: RDD[String], sqlContext: SQLContext): Unit = {  //---->RDD---->DataFrame来进行一个操作  val rowRDD: RDD[Row] = listRDD.map(line => {    val splits = line.split(" ")    val name = splits(0).trim    val age = splits(1).trim.toInt    val height = splits(2).trim.toDouble    Row(name, age, height)  })  //通过动态编码的方式  val structType = StructType(Array(    StructField("name", DataTypes.StringType, true),    StructField("age", DataTypes.IntegerType, true),    StructField("height", DataTypes.DoubleType, true)  ))  val df = sqlContext.createDataFrame(rowRDD, structType)  df.show()}

0 0