Spark SQL 编程初级实践详解
作者:WHYBIGDATA
写在前面
- 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编程的资料请关注脚本之家其它相关文章!