• SparkSQL 之 DataFrame&DataSet


    DataFrame

    创建DataFrame有三种方式:

    1. 读外部设备的文件,返回DataFrame对象

    2. 从RDD转换成DataFrame对象

    3. 读取Hive中的表,返回DataFrame对象

    4. 调用createDataFrame方法,返回DataFrame对象

    一、DataFrame的创建 

    1、准备SparkSession环境

    SparkSession 是 Spark 最新的 SQL 查询起始点

     历史版本已弃用

    1. private val spark: SparkSession = SparkSession.builder().master("local").appName("dataSetDemo").getOrCreate()
    2. import spark.implicits._

    2、通过 Spark 的数据源进行创建

    示例直接读取json文件,json文件自带结构 

    1. private val ruleDf: DataFrame = spark.read.json("src/data/AAAS_RULE_20220316.000")
    2. ruleDf.show()

    3、建临时视图 通过sql操作临时视图

    1. ruleDf.createOrReplaceTempView("AAAS_RULE")
    2. spark.sql("select * from AAAS_RULE where is_pack_buy='1'").show

    4、全局表,并通过SQL操作

    普通临时表是 Session 范围内的,如果想应用范围内有效,可以使用全局临时表。

    使用全局临时表时需要全路径访问: global_temp.AAAS_RULE

    1. ruleDf.createOrReplaceGlobalTempView("Glb_AAAS_RULE")
    2. private val globalTemp: SparkSession = spark.newSession()
    3. globalTemp.sql("select * from global_temp.Glb_AAAS_RULE where is_pack_buy!= 1")
    4. .show()

     5、通过DSL语法操作视图

    1. //打印表结构
    2. ruleDf.printSchema()
    3. ruleDf.select($"API_id" + 1, $"BILL_MODE_LIST").show()
    4. ruleDf.select('Api_id + 2, 'API_NAME).show()
    5. //过滤
    6. ruleDf.filter('Api_id > 1000).show()
    7. //分组
    8. ruleDf.groupBy("IS_PACK_BUY").count().show()

    二、RDD转换为DataFrame 

    RDD -> RDD[case class] -> DataFrame

    1、新增样例类,强类型化数据(城市编码,城市名称,归属大区)

    case class CityList(cityCode:Int,cityName:String,from:String)

    2、case class -> RDD ,RDD关联样例类

    1. private val cityListRdd: RDD[CityList] = aaasRuleRdd.map(_.split("\t"))
    2. .map(data => {
    3. CityList(data(0).toInt, data(1), data(2))
    4. })

    3、RDD -> DataFrame

    1. private val cityListDf: DataFrame = cityListRdd.toDF()
    2. cityListDf.show()
    3. cityListDf.printSchema()

    三、RDD、DataFrame、DataSet之间的转换

    1. println("-----------------Rdd 转换为 DataSet-----------------------")
    2. private val dogList: RDD[(String, Int)] = sc.makeRDD(List(("hotPot",18), ("lorin",19), ("pokey",28)))
    3. private val dogDataFrame: DataFrame = dogList.toDF()
    4. dogDataFrame.show()
    5. dogDataFrame.printSchema()
    6. println("toDF给定列名之后,数据就是强类型")
    7. //toDF给定列名之后,数据就是强类型
    8. private val dataFrame: DataFrame = dogList.toDF("name", "age")
    9. dataFrame.printSchema()
    10. println("-----------------Rdd 转换为 DataSet-----------------------")
    11. //Rdd 转换为 DataSet
    12. private val dogDataSet: Dataset[(String, Int)] = dogList.toDS()
    13. dogDataSet.show
    14. dogDataSet.printSchema()
    15. //DataFrame转换为DataSet,as后面跟的是[]
    16. println("-----------------DataFrame转换为DataSet-----------------------")
    17. //给固定参数类型
    18. private val dataSet: Dataset[(String, Int)] = dogDataFrame.as[(String, Int)]
    19. dataSet.show()
    20. dataSet.printSchema()
    21. //给样例类
    22. /*
    23. * 注意只有给定列名转换的强类型DataFrame才能通过样例类转化为DataSet
    24. * */
    25. private val DataSet: Dataset[DogInfo] = dataFrame.as[DogInfo]
    26. dogDataSet.show()
    27. println("-----------------DataSet 转换为 DataFrame-----------------------")
    28. private val dataFrame1: DataFrame = DataSet.toDF()
    29. private val dataFrame2: DataFrame = DataSet.toDF("name", "age")
    30. dataFrame1.printSchema()
    31. dataFrame2.printSchema()
    32. println("-----------------DataFrame 转换为 RDD-----------------------")
    33. dataFrame2.printSchema()
    34. dataFrame2.rdd.collect().foreach(println)
    35. println("-----------------DataSet 转换为 RDD-----------------------")
    36. dataSet.printSchema()
    37. DataSet.rdd.collect().foreach(println)

    四、两种查询风格

    SQL风格编程:就是编写sql语句,底层翻译成相关算子进行执行

    DSL:domain-specific language:使用 DSL 语法风格不必去创建临时视图了

    1. //查看 DataFrame 的 Schema 信息
    2. val df = spark.read.json("data/user.json")
    3. df.printSchema
    4. //只查看"username"列数据
    5. df.select("username").show()

            

  • 相关阅读:
    解线性方程组python实现直接分解法(Doolittle,克劳特,追赶法)
    【Linux】ubuntu18.04安装mysql5.7安装失败处理
    14届蓝桥青少STEMA-C++组12月评测
    JUL日志框架
    LeetCode 18 四数之和
    C++从入门到精通
    app毕业设计作品安卓毕业设计成品基于Uniapp+SSM实现的智能课堂管理
    vue3在watch和watchEffect的使用
    C现代方法(第5、6章)笔记
    flutter系列之:做一个下载按钮的动画
  • 原文地址:https://blog.csdn.net/qq_40607631/article/details/132623995