大数据处理框架-Spark DataFrame构造、join和null空值填充

1、Spark DataFrame介绍

在这里插入图片描述

DataFrame是Spark SQL中的一个概念,它是一个分布式的数据集合,可以看作是一张表。DataFrame与RDD的主要区别在于,前者带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。

2、构造DataFrame

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.{SparkSession}

object AppendColDFTest {
  Logger.getLogger("org").setLevel(Level.ERROR)
  Logger.getRootLogger().setLevel(Level.ERROR) // 设置日志级别
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("InDFTest")
      .master("local[*]")
      .getOrCreate()

    // 创建aDF和bDF
    val aData = Seq(
      (1, 1, 10, 20, 30),
      (1, 2, 10, 20, 30),
      (2, 1, 10, 20, 20),
      (2, 2, 10, 20, 50),
      (3, 4, 10, 20, 40),
      (3, 5, 10, 20, 30),
        (3, 6, 10, 20, 30),
      (4, 1, 10, 20, 20),
      (4, 2, 10, 20, 50)

    )
    val aDF = spark.createDataFrame(aData).toDF("x", "y", "z", "p", "q")

    val bData = Seq(
      (1, 1, 5, 15, 25),
      (2, 1, 25, 55, 105),
      (3, 4, 75, 85, 95)
    )
    val bDF = spark.createDataFrame(bData).toDF("x", "y", "m", "n", "l")

  }
}

3、两个DataFrame join

// 使用left join关联aDF和bDF
val joinedDF = aDF.join(bDF, Seq("x", "y"), "left")
joinedDF.show()
+---+---+---+---+---+----+----+----+
|  x|  y|  z|  p|  q|   m|   n|   l|
+---+---+---+---+---+----+----+----+
|  1|  1| 10| 20| 30|   5|  15|  25|
|  1|  2| 10| 20| 30|null|null|null|
|  2|  1| 10| 20| 20|  25|  55| 105|
|  2|  2| 10| 20| 50|null|null|null|
|  3|  4| 10| 20| 40|  75|  85|  95|
|  3|  5| 10| 20| 30|null|null|null|
|  3|  6| 10| 20| 30|null|null|null|
|  4|  1| 10| 20| 20|null|null|null|
|  4|  2| 10| 20| 50|null|null|null|
+---+---+---+---+---+----+----+----+

4、null空值填充

// 添加新的列,并填充空缺的值
val resultDF = joinedDF
  .withColumn("m", when(col("m").isNull, lit(0)).otherwise(col("m")))
  .withColumn("n", when(col("n").isNull, lit(0)).otherwise(col("n")))
  .withColumn("l", when(col("l").isNull, lit(0)).otherwise(col("l")))
  .select("x", "y", "m", "n", "l")
  .orderBy("x", "y")

// 显示最终结果
resultDF.show()
+---+---+---+---+---+
|  x|  y|  m|  n|  l|
+---+---+---+---+---+
|  1|  1|  5| 15| 25|
|  1|  2|  0|  0|  0|
|  2|  1| 25| 55|105|
|  2|  2|  0|  0|  0|
|  3|  4| 75| 85| 95|
|  3|  5|  0|  0|  0|
|  3|  6|  0|  0|  0|
|  4|  1|  0|  0|  0|
|  4|  2|  0|  0|  0|
+---+---+---+---+---+
### **Spark SQL 零售商店数据分析项目** **项目名称**:零售商店销售数据分析 ​**技术栈**​:Spark 3.x + Python/Scala ​**考核目标**​:掌握 DataFrame 创建、查询、聚合、多表关联等核心操作 ------ ## **一、数据集说明** ### **1. 员工表 `employee.csv`** ```csv emp_id,name,age,gender,department,salary,hire_date E001,张伟,35,M,销售部,8500,2020-05-12 E002,李娜,28,F,财务部,9200,2021-02-18 E003,王强,42,M,物流部,7800,2019-08-03 E004,赵敏,31,F,销售部,8800,2021-07-22 E005,刘洋,26,M,IT部,10500,2022-01-15 E006,陈雪,29,F,销售部,8600,2020-11-30 E007,杨光,33,M,财务部,9500,2018-09-10 E008,周婷,27,F,物流部,8000,2022-03-25 ``` ### **2. 销售表 `sales.csv`** ```csv sale_id,emp_id,product_id,quantity,unit_price,sale_date S001,E001,P1001,2,299.50,2023-05-10 S002,E004,P1002,1,1599.00,2023-06-15 S003,E001,P1003,3,89.90,2023-04-18 S004,E006,P1001,1,299.50,2023-07-02 S005,E003,P1004,2,450.00,2023-05-28 S006,E004,P1002,1,1599.00,2023-06-20 S007,E002,P1005,4,120.00,2023-03-12 S008,E005,P1003,2,89.90,2023-08-05 ``` ### **3. 商品表 `product.csv`** ```csv product_id,product_name,category,supplier P1001,无线耳机,电子产品,SupplierA P1002,智能手机,电子产品,SupplierB P1003,保温杯,日用品,SupplierC P1004,运动鞋,服装,SupplierD P1005,笔记本,文具,SupplierA ``` ------ ## **二、考核任务** ### **任务1:DataFrame 创建与基础操作(30分)** 1. 加载所有CSV文件为DataFrame,并打印Schema(10分) 2. 统计各部门员工数量(10分) 3. 查询薪资超过9000的员工(10分) **示例代码**: ```python employee_df = spark.read.csv("employee.csv", header=True, inferSchema=True) employee_df.filter("salary > 9000").show() ``` ### **任务2:数据清洗与转换(20分)** 1. 处理销售表中的空值(`quantity`缺失时填充1)(10分) 2. 计算每笔销售的总金额(`quantity * unit_price`)(10分) **示例代码**: ```python from pyspark.sql.functions import col sales_df = sales_df.na.fill({"quantity": 1}) sales_df.withColumn("total_amount", col("quantity") * col("unit_price")).show() ``` ### **任务3:多表关联与聚合(40分)** 1. 查询每笔销售的详细信息(含员工名商品名)(15分) 2. 统计各商品类别的销售总额(15分) 3. 找出销售额最高的员工(显示姓名总销售额)(10分) **示例代码**: ```python joined_df = sales_df.join(employee_df, "emp_id").join(product_df, "product_id") joined_df.select("name", "product_name", "total_amount").show() ``` ------ ## **三、提交要求** 1. **代码文件**:完整的PySpark/Scala脚本 2. **运行截图**:关键查询结果的终端输出 3. 分析报告 (可选): - 数据质量问题处理方式 - 关键业务发现(如最佳销售部门、热门商品) ------ ## **四、评分标准** | **任务** | **评分点** | **分值** | | :------------: | :----------------------: | :------: | | DataFrame创建 | 正确加载数据并打印Schema | 30 | | 数据清洗 | 空值处理、计算列添加 | 20 | | 多表关联与聚合 | JOIN操作、聚合函数使用 | 40 | | 数据可视化 | 图表正确性 | 10 | **建议时间**:120分钟 ​**难度**​:⭐️⭐️⭐️(中等) ------ ## **五、扩展挑战(可选)** 1. 计算员工销售额的月度增长率 2. 使用窗口函数找出各部门薪资最高的员工 **示例代码**: python 复制 ```python from pyspark.sql.window import Window windowSpec = Window.partitionBy("department").orderBy(col("salary").desc()) employee_df.withColumn("rank", rank().over(windowSpec)).show() ``` ------ ### **项目特点** 1. **业务贴近性**:零售行业真实场景(员工、销售、商品) 2. **技能全覆盖**:从数据加载到复杂聚合+可视化 3. **可扩展性**:可通过增加数据量或添加时间分析提升难度
最新发布
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值