文档:02_尚硅谷大数据技术之SparkSql.docx

    DataFrame是对RDD的封装,增加了结构化信息
    image.png
    image.png
    Json字符串:
    JavaScript Object Notation
    eg: var obj = {“name”: “zhangsan”, “age”: 20}
    var objs = [{“name”: “zhangsan”, “age”: 20}]
    (上面两个例子都是Json)

    AJAX + JSON => 前端技术

    视图(view):一个查询结果集

    从DataFrame转回RDD时RDD的存储类型是Row


    Dataset是强类型的数据集合

    RDD转换样例类,然后toDS方法就可以转为Dataset

    Dataset转RDD直接调用rdd方法

    DataFrmae转Dataset时使用as[样例类]

    Dataset转DataFrame使用toDF

    JSON文件要求文件整体格式符合JSON要求

    SparkSQL底层是SparkCore,SparkCore读取文件使用的是Hadoop

    所以Spark中要求JSON文件中每一行符合JSON格式即可(IDEA提示有错也没事)

    在使用特殊操作时,需要隐式转换操作的,这个隐式转换在shell窗口自动导入,所以可以直接使用

    在当前环境中,没有自动引入这些隐式转换,所以会报错,需要引入 import spark.implicits._

    import 关键字可以导入对象的方法,这个对象的声明必须是 val ,不能是 var

    这里的spark不是包名,是对象名(import spark.implicits._


    DataFrame & Dataset

    type DataFrame = Dataset[Row]

    Dataset[Person] => RDD[Person]

    DataFrame => RDD[Row] 相当于:
    DataFrame = Dataset[Row] => RDD[Row]

    DataFrame其实就是Dataset,只不过是特定类型的Dataset(Row类型)

    sql语句中早期版本只支持弱类型的聚合函数,不支持强类型的聚合函数

    在Spark3.0版本后,可以通过特殊操作,将强类型转换为弱类型

    UDAF(用户自定义聚合函数)是弱类型的, UserDefinedAggregateFunction(3.0.0版本被标为废弃)

    Aggregator是强类型的(3.0.0版本用于替代UserDefinedAggregateFunction)

    (Java中一次性只能做32位的操作,所以long和double都是64位的,就要分2次进行操作,不是原子性的

    早期版本的Spark无法将强类型的聚合函数应用在SQL文中

    强类型聚合函数在早期版本中使用DSL方式来操作

    强类型聚合函数可以转换为查询列进行操作

    行式存储有利于查询,不利于统计
    列式存储有利于统计,不利于查询
    (parquet格式文件是列存储)