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

1、Spark DataFrame介绍

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

2、构造DataFrame

scala 复制代码
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

scala 复制代码
// 使用left join关联aDF和bDF
val joinedDF = aDF.join(bDF, Seq("x", "y"), "left")
joinedDF.show()
bash 复制代码
+---+---+---+---+---+----+----+----+
|  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空值填充

scala 复制代码
// 添加新的列,并填充空缺的值
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()
bash 复制代码
+---+---+---+---+---+
|  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|
+---+---+---+---+---+
相关推荐
珠海西格电力37 分钟前
零碳园区全面感知体系的建设成本和收益分析包含哪些关键数据?
大数据·数据库·人工智能·智慧城市·能源
QYR_111 小时前
光模块行业全景解析:全球市场规模、格局分布及发展趋势(2026-2032)
大数据·人工智能
无心水1 小时前
【任务调度:框架】10、2026最新!分布式任务调度选型决策树:再也不纠结选哪个
人工智能·分布式·算法·决策树·机器学习·架构·2025博客之星
上海锟联科技2 小时前
什么是DAS分布式光纤声波传感系统?原理与应用解析
数据结构·分布式·算法·分布式光纤传感
茶本无香2 小时前
【无标题】Kafka 系列博文(一):从零认识 Kafka,到底解决了什么问题?
java·分布式·kafka
czlczl200209252 小时前
插入时先写DB后写Redis?分布式中传统双写模式的缺陷
数据库·redis·分布式
九硕智慧建筑一体化厂家2 小时前
什么是楼宇自控?全面解析楼宇自控与楼宇自控系统的作用
大数据·运维·人工智能·网络协议·制造
灰化肥发挥3 小时前
韩国草药制剂数据查询:如何获取MFDS注册数据与韩国药典标准?
大数据·人工智能·医药数据库
斯普信专业组3 小时前
Kafka集群数据迁移方案:基于MirrorMaker2的集群迁移实施步骤
分布式·kafka·linq
小王毕业啦3 小时前
2010-2023年 地级市-破产法庭设立数据(+文献)
大数据·人工智能·数据挖掘·数据分析·社科数据·经管数据·破产法庭