12.11日记

发布时间 2023-12-11 23:17:52作者: zhangmingmingkjz
使用DataFrame有两个方式,分别是 SQL语法和DSL语法

➢ SQL语法
    1. 通过 "临时视图" 来使用,所以先创建视图
    2. 通过 sparkSession对象执行sql进行数据查询
    scala> df.createOrReplaceTempView("user")  //创建临时视图
    scala> var viewdf = spark.sql("select id,name,age from user") //通过spark执行sql
    viewdf: org.apache.spark.sql.DataFrame = [id: bigint, name: string] //执行sql返回的还是DF
    scala> viewdf.show  //展示DF中的数据
    scala> spark.sql("select id,name,age from user").show  //也可以直接查询sql并展示
    +---+-----+---+
    | id| name|age|
    +---+-----+---+
    |  1|jack1| 18|
    |  2|jack2| 28|
    |  3|jack3| 38|
    +---+-----+---+
    
    注意:
        df.createOrReplaceTempView 只能创建当前会话有效的临时视图
        df.createOrReplaceGlobalTempView 能创建所有会话都有效的临时视图
        使用时 需要在视图名前面加上  global_temp.视图名
        
➢ DSL语法
    DSL称为 Domain-Specific Language 特定领域语言
    这是 DataFrame中管理结构化数据的API ,通过DataFrame就可以调用这些API

    scala> df.printSchema
            root
             |-- age: long (nullable = true)
             |-- id: long (nullable = true)
             |-- name: string (nullable = true)
    scala> df.select("name")
            res20: org.apache.spark.sql.DataFrame = [name: string]
    //基本查询
    scala> df.select("name").show
            +-----+
            | name|
            +-----+
            |jack1|
            |jack2|
            |jack3|
            +-----+
   //列运算         
    scala> df.select($"age" + 1).show
    scala> df.select('age + 1).show
            +---------+
            |(age + 1)|
            +---------+
             |       19|
             |       29|
             |       39|
            +---------+
            
    //取别名
    scala> df.select('name,'age + 1 as "aa").show
            +-----+---+
            | name| aa|
            +-----+---+
            |jack1| 19|
            |jack2| 29|
            |jack3| 39|
            +-----+---+    
    //统计函数
    scala> df.select(avg("age") as "平均年龄").show
            +--------+
            |平均年龄|
            +--------+
            |    48.0|
            +--------+
    //条件过滤
    scala> df.filter('age > 25).show
            +---+---+-----+
            |age| id| name|
            +---+---+-----+
            | 28|  2|jack2|
            | 38|  3|jack3|
            +---+---+-----+
    //组合+聚合函数
    scala> df.groupBy("id").count.show
            +---+-----+
            | id|count|
            +---+-----+
            |  1|    1|
            |  3|    1|
            |  2|    1|
            +---+-----+