spark的DataFrame的schema模式:讀時模式, 指定模式


讀時模式

    val path="/Volumes/Data/BigData_code/data/"
    //讀取json生成dataframe
    val df = spark.read.format("json").load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

讀時模式是通過前幾行的數據,來對各個列進行推斷各個列的數據類型。優點是方便。但是,讀時模式會造成精度損失。因為在前幾行推斷出是int類型,但是,實際是long類型。

指定模式

方法1:使用StructType實現指定

    val path="/Volumes/Data/BigData_code/data/"
    //自定義schema模式
    val mySchema = StructType(Array(
      StructField("DEST_COUNTRY_NAME", StringType, true),
      StructField("ORIGIN_COUNTRY_NAME", StringType, true),
      StructField("count", LongType, false, Metadata.fromJson("{\"home\":\"world\"}"))
    ))
    //生成DataFrame
    val df = spark.read.format("json").schema(mySchema) //使用自定義的schema模式
      .load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

方法2:使用case class實現指定

    val path="/Volumes/Data/BigData_code/data/"
    //自定義schema模式
    case class myClass (
         DEST_COUNTRY_NAME:String,ORIGIN_COUNTRY_NAME:String,count:Long
                           )
    val mySchema = Encoders.product[myClass].schema
    //生成DataFrame
    val df = spark.read.format("json").schema(mySchema) //使用自定義的schema模式
      .load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

假如,不需要指定列名可以使用以下方法:

    val path="/Volumes/Data/BigData_code/data/"
    //自定義schema模式
    val mySchema = Encoders.product[(String, String, Long)].schema
    //生成DataFrame
    val df = spark.read.format("json").schema(mySchema) //使用自定義的schema模式
      .load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

注意:這里有給默認的列名:_1,_2,_3。自己可以使用printSchema輸出一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM