(一)案例导入
有一个名为 ecommerce_data.csv 的 CSV 文件,包含以下列:order_id(订单编号)、product_id(商品编号)、product_name(商品名称)、quantity(购买数量)、price(商品单价)、user_id(用户编号)、order_date(订单日期)。
目标要求是:筛选出购买数量大于 5 的订单信息。
order_id,product_id,product_name,quantity,price,user_id,order_date
1,101,iPhone 15,2,999.99,1001,2024-01-01
2,102,Samsung Galaxy S24,3,899.99,1002,2024-01-02
3,103,MacBook Pro,1,2499.99,1003,2024-01-03
4,104,PlayStation 5,2,499.99,1004,2024-01-04
5,105,Xbox Series X,1,499.99,1005,2024-01-05
6,101,iPhone 15,1,999.99,1006,2024-01-06
7,102,Samsung Galaxy S24,2,899.99,1007,2024-01-07
8,103,MacBook Pro,8,2499.99,1008,2024-01-08
9,104,PlayStation 5,1,499.99,1009,2024-01-09
10,105,Xbox Series X,12,499.99,1010,2024-01-10
(二)思路分析
这是一个非常标准的二维表,我们能不能像处理数据库的数据表一样,使用SQL语句呢?
【如何这是一个二维表,如何写sql语句来做查询】
答:可以。可以读入文件,然后使用类似于sql中的seletc * from where quantity > 5 这样的语句。
(三)DataFrame的概念
DataFrame 是一种分布式数据集,类似于传统数据库中的二维表格,具有行和列的结构。它是 RDD 的一种高级抽象,提供了更丰富的操作接口和优化的执行引擎。
DataFrame 可以从多种数据源创建,如文件(CSV、JSON等)、数据库等。
使用DataFrame处理结构化数据有两种方式: 1.是DSL编程; 2. SQL 语句
(四)SQL风格操作DataFrame
使用sql风格操作的前提是将DataFrame注册成一个临时表,在程序中直接使用spark.sql()方式执行SQL查询,结果将作为一个DataFrame返回。
val spark = SparkSession.builder()
.appName("SparkSQL01")
.master("local[*]")
.getOrCreate()
// 读取 CSV 文件并创建 DataFrame
val df= spark.read
.option("header", "true")
.option("inferSchema", "true")
.csv("ecommerce_data.csv")
df.registerTempTable("t_per")
spark.sql("select * from t_per where quantity > 5").show()
需要提前导入相关的包。
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.15</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.3.1</version>
</dependency>
(五)DSL风格操作DataFrame
前面我们使用sql语句的方式完成了数据的筛选,下面我们通过一个例子来看看DSL的使用方式。然后就调用它的相关方法:printSchema和show。
// 读取 CSV 文件并创建 DataFrame
val ecommerceDF = spark.read
.option("header", "true")
.option("inferSchema", "true")
.csv("ecommerce_data.csv")
// 显示 DataFrame 的基本信息
ecommerceDF.printSchema()
// 显示 DataFrame 的前几行数据
ecommerceDF.show()
// 筛选出购买数量大于 5 的订单
val filteredDF = ecommerceDF.filter($"quantity" > 5)
filteredDF.show()