通过StructType直接指定Schema

Spark SQL能够将含Row对象的RDD转换成DataFrame,并推断数据类型。通过将一个键值对(key/value)列表作为kwargs传给Row类来构造Rowskey定义了表的列名,类型通过看第一列数据来推断。(所以这里RDD的第一列数据不能有缺失)未来版本中将会通过看更多数据来推断数据类型,像现在对JSON文件的处理一样。


package com.wl.spark

import java.util.Properties

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row, SQLContext}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * desc:
  * Created by anmoFree on 2018/4/7  
  */
object GenerateDFByStructType {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("GenerateDFByStructType")
      .setMaster("local")

    val sc = new SparkContext(conf)

    val sqlContext = new SQLContext(sc)

    // 从指定文件创建RDD
    val fileRDD: RDD[String] = sc.textFile("F:/stu.txt")

    // 切分数据
    val lineRDD: RDD[Array[String]] = fileRDD.map(_.split(" "))

    // 通过StructType直接指定每个字段的schema
    val schema = StructType(
      List(
        // true代表不为空
        StructField("id", IntegerType, true),
        StructField("name", StringType, true),
        StructField("scores", IntegerType, true)
      )
    )

    // 将RDD映射到rowRDD上
    val rowRDD: RDD[Row]= lineRDD.map(s => Row(s(0).toInt, s(1), s(2).toInt))

    // 将schema信息应用到rowRDD上
    val stuDF: DataFrame = sqlContext.createDataFrame(rowRDD, schema)

    // 将DataFrame注册为临时表
    stuDF.registerTempTable("t_student")

    // 对临时表进行操作
    val df: DataFrame = sqlContext.sql("select * from t_student order by scores desc limit 2")

    // 第一种方式,将结果以JSON的方式存储到指定文件夹
//    df.write.json("F:/result1")
    /*
    结果:
    {"id":101,"name":"tom","scores":98}
    {"id":106,"name":"henry","scores":89}
     */

    // 第二种方式, 将结果写进数据库
    // 封装请求MySQL的配置信息
    val prop = new Properties()
    prop.put("user","root")
    prop.put("password","root")
    prop.put("driver","com.mysql.jdbc.Driver")

    // 把数据写入MySQL  以append方式追加
    df.write.mode("append").jdbc("jdbc:mysql://localhost:3306/sparktest","student",prop)

    // 停止Spark Context
    sc.stop()
  }
}

数据库中的结果:

通过StructType直接指定Schema_第1张图片

你可能感兴趣的:(spark,mysql,Spark)