package com.sev7e0.wow.sql

import org.apache.spark.sql.SparkSession

/**
  * 1.可以读取指定格式文件,同时生成指定格式的文件 目前支持 json,parquet,orc,hivetable,jdbc,avro file
  * 2.可以直接在文件中执行SQL语句
  * 3.支持一下几种保存模式,ErrorIfExists;Append;Overwrite;Ignore
  * 4.支持将DataFrame保存到持久表(不同于createOrReplaceTempView,saveAsTable将会持久化到存储,即使spark程序重启也会存在)
  * 5.在spark2.1中持久化的原数据信息将会保存到Hive元数据中,好处是,在查询时可以减少对不必要的partition进行查询,配置单元DDL,如改变表分区…集合位置现在可用于使用数据源API创建的表。
  * 6.对基于文件的数据源,也可以进行bucket存储,排序和分区,bucket和排序只适用于持久表
  *
  * @program: wow-spark
  * @description:
  * @author: Lijiaqi
  * @create: 2019-01-08 01:01
  **/
object A_0_LoadSaveFunction {
  def main(args: Array[String]): Unit = {
    val session = SparkSession.builder().master("local")
      .appName("LoadSaveFunction")
      .getOrCreate()

    val users = session.read.load("/Users/sev7e0/workspace/idea-workspace/sparklearn/src/main/resources/sparkresource/users.parquet")
    users.select("name","favorite_color").write.mode(saveMode = "overwrite").save("namesAndFavColors.parquet")

    /**
      * load中的路径可以使用文件夹,但是只能存在一种类型,就是format中指定的类型
      */
    val orcDF = session.read.format("orc").load("/Users/sev7e0/workspace/idea-workspace/sparklearn/src/main/resources/spark resource")
    orcDF.show()

//    session.sqlContext
//    users.write.format("orc")
//      .option("orc.bloom.filter.columns","favorite_color")
//      .option("orc.dictionary.key.threshold","1.0")
//      .save("users_with_option.orc")

    //k可以指定格式名称,从任意数据源进行转换
    val peopleDS = session.read.json("src/main/resources/sparkresource/people.json")
    peopleDS.select("name","age").write.mode(saveMode = "overwrite").format("parquet").save("nameAndAge.parquet")

    //从指定格式转换为另一种格式
    val dataFrameCSV = session.read.option("sep",";").option("inferSchema","true")
      .option("header","true").csv("src/main/resources/sparkresource/people.csv")
    dataFrameCSV.select("name","age").write.mode(saveMode = "overwrite").format("json").save("csvToJson.json")

    //直接在文件中执行SQL
    val fromParquetFile = session.sql("SELECT * FROM parquet.`src/main/resources/sparkresource/users.parquet`")
//    fromParquetFile.show()

    //对于生成指定文件可以指定key进行分区
    users.write.partitionBy("favorite_color").format("parquet").mode(saveMode = "overwrite")
      .save("namesPartitionByColor.parquet")
  }

}