Spark SQL 编程初级实践详解

 更新时间:2023年04月20日 09:45:23   作者:WHYBIGDATA  
这篇文章主要为大家介绍了Spark SQL 编程初级实践详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

写在前面

  • Linux:CentOS7.5
  • Spark: spark-3.0.0-bin-hadoop3.2
  • IDE:IntelliJ IDEA2020.2.3

第1题:Spark SQL 基本操作

将下列 JSON 格式数据复制到 Linux 系统中,并保存命名为 employee.json。

{ "id":1 , "name":" Ella" , "age":36 }; { "id":2, "name":"Bob","age":29 }; { "id":3 , "name":"Jack","age":29 }; { "id":4 , "name":"Jim","age":28 } ;{ "id":4 , "name":"Jim","age":28 }; { "id":5 , "name":"Damon" } ;{ "id":5 , "name":"Damon" }

为 employee.json 创建 DataFrame,并写出 Scala 语句完成下列操作:

  • 第1小题:查询所有数据;
  • 第2小题:查询所有数据,并去除重复的数据;
  • 第3小题:查询所有数据,打印时去除 id 字段;
  • 第4小题:筛选出 age>30 的记录;
  • 第5小题:将数据按 age 分组;
  • 第6小题:将数据按 name 升序排列;
  • 第7小题:取出前 3 行数据;
  • 第8小题:查询所有记录的 name 列,并为其取别名为 username;
  • 第9小题:查询年龄 age 的平均值;
  • 第10小题:查询年龄 age 的最小值。

主程序代码

import org.apache.spark.sql.{DataFrame, SparkSession}
object t1 {
   def main(args: Array[String]): Unit = {
       val spark: SparkSession = SparkSession.builder()
         .appName("t1")
         .master("local[2]")
         .getOrCreate()
       import spark.implicits._
       val df: DataFrame = spark.read.json("dataset/ch05/employee.json")
//        df.show()
//        df.distinct().show()
//        df.drop("id").show()
//        df.filter(df("age") > 20).show()
//        df.groupBy("name").count().show()
//        df.sort(df("name").asc).show()
//        val rows = df.take(3)
//        rows.foreach(println)
//        df.select(df("name").as("username")).show()
//        df.agg("age" -> "avg").show()
       df.agg("age" -> "min").show()
   }
}

主程序执行结果

下图从上到下、从左到右以此为第一、二、三、…、十道题的执行结果

本题很简单,就是相关方法的调用。

第2题:编程实现将 RDD 转换为 DataFrame

题目

源文件内容如下(包含 id,name,age):

1,Ella,36 2,Bob,29 3,Jack,29

请先将数据复制保存到 Linux 系统中,命名为 employee.txt,实现从 RDD 转换得到 DataFrame,并按“id:1,name:Ella,age:36”的格式打印出 DataFrame 的所有数据。请写出程序代码。

主程序代码

import org.apache.spark.sql.{DataFrame, SparkSession}
object t2 {
    def main(args: Array[String]): Unit = {
        val spark: SparkSession = SparkSession.builder()
          .appName("t1")
          .master("local[2]")
          .getOrCreate()
        val employeeInfo = spark.sparkContext.textFile("/input/dataset/employee.txt")
        import spark.implicits._
        val employeeDF: DataFrame = employeeInfo.map(_.split(","))
          .map(attributes =>
              Employee(attributes(0).trim.toInt, attributes(1), attributes(2).trim.toInt)
          ).toDF()
        employeeDF.createTempView("employee")
        val employeeRDD: DataFrame = spark.sql("select id, name, age from employee")
        employeeRDD.map(e => {
            "id:" + e(0) + ",name:" + e(1) + ",age:" + e(2)
        }).show(10, false)
    }
}
case class Employee(id: Long, name: String, age: Long) {
}

主程序执行结果

本题重在map算子的使用并创建视图执行sql查询,注意程序中要使用到import spark.implicits._

第3题:编程实现利用 DataFrame 读写 MySQL 的数据

题目

(1)在 MySQL 数据库中新建数据库 sparktest,再创建表 employee,包含如表 6-2 所示的 两行数据。

(2)配置 Spark 通过 JDBC 连接数据库 MySQL,编程实现利用 DataFrame 插入如表 6-3 所 示的两行数据到 MySQL 中,最后打印出 age 的最大值和 age 的总和。

主程序代码

import java.util.Properties
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
object t3 {
    def main(args: Array[String]): Unit = {
        val spark: SparkSession = SparkSession.builder()
          .appName("t3")
          .master("local[2]")
          .getOrCreate()
        val employeeRDD: RDD[Array[String]] = spark.sparkContext.parallelize(
            Array("3 Mary F 26", "4 Tom M 23")).map(_.split(" ")
        )
        val schema: StructType = StructType(List(
            StructField("id", IntegerType, true),
            StructField("name", StringType, true),
            StructField("gender", StringType, true),
            StructField("age", IntegerType, true)
        ))
        val rowRDD: RDD[Row] = employeeRDD.map(p => Row(p(0).toInt, p(1).trim, p(2).trim, p(3).toInt))
        val df: DataFrame = spark.createDataFrame(rowRDD, schema)
        val properties = new Properties()
        properties.put("user", "root");
        properties.put("password", "123456");
        properties.put("driver", "com.mysql.jdbc.Driver");
        // serverTimezone=UTC语句需要跟在数据库连接语句的第一个位置,否则会报错
        df.write.mode("append").jdbc("jdbc:mysql://localhost:3306/bd01_spark?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false",
            "bd01_spark.employee", properties)
        val jdbcDF: DataFrame = spark.read.format("jdbc")
          .option("url", "jdbc:mysql://localhost:3306/bd01_spark")
          .option("driver", "com.mysql.jdbc.Driver")
          .option("dbtable", "employee")
          .option("user", "root")
          .option("password", "123456")
          .load()
        jdbcDF.agg("age" -> "max", "age" -> "sum").show(10, false)
    }
}

本题主要在于MySQL的JDBC连接创建。

主程序执行结果

以上就是Spark SQL 编程初级实践详解的详细内容,更多关于Spark SQL编程的资料请关注脚本之家其它相关文章!

相关文章

  • Java如何打印完整的堆栈信息

    Java如何打印完整的堆栈信息

    这篇文章主要为大家介绍了Java如何打印完整的堆栈信息示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 基于Java中两种jersey文件上传方式

    基于Java中两种jersey文件上传方式

    这篇文章主要介绍了基于Java中两种jersey文件上传方式的相关资料,需要的朋友可以参考下
    2016-01-01
  • Java中scheduleAtFixedRate的用法

    Java中scheduleAtFixedRate的用法

    如何正确使用Java中的scheduleAtFixedRate是一篇介绍Java中定时任务调度器的文章。它详细介绍了scheduleAtFixedRate方法的用法、参数及作用,并给出了一些实例以帮助读者更好地理解其使用。本文为Java开发人员提供了一些实用的技巧,帮助他们更好地管理和控制定时任务
    2023-04-04
  • Java ProcessBuilder执行多次CMD命令的使用

    Java ProcessBuilder执行多次CMD命令的使用

    本文介绍了Java的ProcessBuilder类,该类用于执行外部命令,通过ProcessBuilder,我们可以在Java程序中灵活地执行多次CMD命令,并控制输入输出流以及工作目录等,感兴趣的可以了解一下
    2024-11-11
  • Java多线程编程中的两种常用并发容器讲解

    Java多线程编程中的两种常用并发容器讲解

    这篇文章主要介绍了Java多线程编程中的两种常用并发容器讲解,分别是ConcurrentHashMap与ConcurrentHashMap,需要的朋友可以参考下
    2015-12-12
  • springboot配置mysql数据库spring.datasource.url报错的解决

    springboot配置mysql数据库spring.datasource.url报错的解决

    这篇文章主要介绍了springboot配置mysql数据库spring.datasource.url报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java Clone接口和深拷贝详解

    java Clone接口和深拷贝详解

    今天小编就为大家分享一篇关于Java Clonable接口和深拷贝详解上的深入了解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • SpringMVC拦截器零基础掌握

    SpringMVC拦截器零基础掌握

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
    2023-03-03
  • SpringCloud远程服务调用三种方式及原理

    SpringCloud远程服务调用三种方式及原理

    本文给大家介绍SpringCloud远程服务调用实战笔记,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-12-12
  • java单例五种实现模式解析

    java单例五种实现模式解析

    这篇文章主要介绍了java单例五种实现模式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论