Spark的DataFrame和Schema详解和实战案例Demo

Spark:DataFrame介绍及使用 DataFrame介绍及使用 阅读详情

1、概念介绍

Spark是一个分布式计算框架,用于处理大规模数据处理任务。在Spark中,DataFrame是一种分布式的数据集合,类似于关系型数据库中的表格。DataFrame提供了一种更高级别的抽象,允许用户以声明式的方式处理数据,而不需要关心底层数据的细节和分布式计算的复杂性。Schema在Spark中用于描述DataFrame中的数据结构,类似于表格中的列定义。

让我们分别介绍一下DataFrame和Schema:

DataFrame:

DataFrame是由行和列组成的分布式数据集合,类似于传统数据库或电子表格的结构。Spark的DataFrame具有以下特点:
分布式计算:DataFrame是分布式的,可以在集群中的多个节点上进行并行处理,以实现高性能的大规模数据处理。
不可变性:DataFrame是不可变的,这意味着一旦创建,就不能修改。相反,对DataFrame的操作会生成新的DataFrame。
延迟执行:Spark采用了延迟执行策略,即DataFrame上的操作并不立即执行,而是在需要输出结果时进行优化和执行。
用户可以使用SQL语句、Spark的API或Spark SQL来操作DataFrame,进行数据过滤、转换、聚合等操作。DataFrame的优势在于其易用性和优化能力,Spark会根据操作的执行计划来优化整个计算过程,以提高性能。

Schema:

Schema是DataFrame中数据的结构描述,它定义了DataFrame的列名和列的数据类型。在Spark中,Schema是一个包含列名和数据类型的元数据集合。DataFrame的Schema信息对于优化计算和数据类型的正确解释至关重要。
通常,Schema是在创建DataFrame时自动推断的,也可以通过编程方式显式指定。指定Schema的好处是可以确保数据被正确解释并且避免潜在的类型转换错误。如果数据源不包含Schema信息或者需要修改Schema,可以使用StructType和StructField来自定义Schema。例如,可以创建一个包含多个字段和数据类型的Schema,如字符串、整数、日期等。

在使用Spark读取数据源时,如CSV文件、JSON数据、数据库表等,Spark会尝试自动推断数据的Schema。如果数据源本身没有提供足够的信息,可以使用schema选项来指定或者通过后续的数据转换操作来调整DataFrame的Schema。

总结:DataFrame是Spark中一种强大的分布式数据结构,允许用户以声明式的方式处理数据,而Schema则用于描述DataFrame中数据的结构信息,确保数据被正确解释和处理。这两个概念共同构成了Spark强大的数据处理能力。

代码实战

package test.scala

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{IntegerType, StringType, StructType}

object TestSchema {
  def getSparkSession(appName: String, localType: Int): SparkSession = {
    val builder: SparkSession.Builder = SparkSession.builder().appName(appName)
    if (localType == 1) {
      builder.master("local[8]") // 本地模式,启用8个核心
    }

    val spark = builder.getOrCreate() // 获取或创建一个新的SparkSession
    spark.sparkContext.setLogLevel("ERROR") // Spark设置日志级别
    spark
  }

  def main(args: Array[String]): Unit = {
    println("Start TestSchema")
    val spark: SparkSession = getSparkSession("TestSchema", 1)

    val structureData = Seq(
      Row("36636", "Finance", Row(3000, "USA")),
      Row("40288", "Finance", Row(5000, "IND")),
      Row("42114", "Sales", Row(3900, "USA")),
      Row("39192", "Marketing", Row(2500, "CAN")),
      Row("34534", "Sales", Row(6500, "USA"))
    )

    val structureSchema = new StructType()
      .add("id", StringType)
      .add("dept", StringType)
      .add("properties", new StructType()
        .add("salary", IntegerType)
        .add("location", StringType)
      )

    val df = spark.createDataFrame(
      spark.sparkContext.parallelize(structureData), structureSchema)
    df.printSchema()
    df.show(false)

    val row = df.first()
    val schema = row.schema
    val structTypeList = schema.toList
    println(structTypeList.size)
    for (i <- 0 to structTypeList.size - 1) {
      val structType = structTypeList(i)
      println(structType.name, row.getAs(structType.name), structType.dataType, structType.dataType)
    }
  }
}

输出

Start TestSchema
Using Spark’s default log4j profile: org/apache/spark/log4j-defaults.properties
23/07/29 09:47:59 INFO SparkContext: Running Spark version 2.4.0
23/07/29 09:47:59 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
23/07/29 09:47:59 INFO SparkContext: Submitted application: TestSchema
23/07/29 09:47:59 INFO SecurityManager: Changing view acls to: Nebula
23/07/29 09:47:59 INFO SecurityManager: Changing modify acls to: Nebula
23/07/29 09:47:59 INFO SecurityManager: Changing view acls groups to:
23/07/29 09:47:59 INFO SecurityManager: Changing modify acls groups to:
23/07/29 09:47:59 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(Nebula); groups with view permissions: Set(); users with modify permissions: Set(Nebula); groups with modify permissions: Set()
23/07/29 09:48:01 INFO Utils: Successfully started service ‘sparkDriver’ on port 60785.
23/07/29 09:48:01 INFO SparkEnv: Registering MapOutputTracker
23/07/29 09:48:01 INFO SparkEnv: Registering BlockManagerMaster
23/07/29 09:48:01 INFO BlockManagerMasterEndpoint: Using org.apache.spark.storage.DefaultTopologyMapper for getting topology information
23/07/29 09:48:01 INFO BlockManagerMasterEndpoint: BlockManagerMasterEndpoint up
23/07/29 09:48:01 INFO DiskBlockManager: Created local directory at C:\Users\Nebula\AppData\Local\Temp\blockmgr-6f861361-4d98-4372-b78a-2949682bd557
23/07/29 09:48:01 INFO MemoryStore: MemoryStore started with capacity 8.3 GB
23/07/29 09:48:01 INFO SparkEnv: Registering OutputCommitCoordinator
23/07/29 09:48:01 INFO Utils: Successfully started service ‘SparkUI’ on port 4040.
23/07/29 09:48:01 INFO SparkUI: Bound SparkUI to 0.0.0.0, and started at http://LAPTOP-PEA8R2PO:4040
23/07/29 09:48:01 INFO Executor: Starting executor ID driver on host localhost
23/07/29 09:48:01 INFO Utils: Successfully started service ‘org.apache.spark.network.netty.NettyBlockTransferService’ on port 60826.
23/07/29 09:48:01 INFO NettyBlockTransferService: Server created on LAPTOP-PEA8R2PO:60826
23/07/29 09:48:01 INFO BlockManager: Using org.apache.spark.storage.RandomBlockReplicationPolicy for block replication policy
23/07/29 09:48:01 INFO BlockManagerMaster: Registering BlockManager BlockManagerId(driver, LAPTOP-PEA8R2PO, 60826, None)
23/07/29 09:48:01 INFO BlockManagerMasterEndpoint: Registering block manager LAPTOP-PEA8R2PO:60826 with 8.3 GB RAM, BlockManagerId(driver, LAPTOP-PEA8R2PO, 60826, None)
23/07/29 09:48:01 INFO BlockManagerMaster: Registered BlockManager BlockManagerId(driver, LAPTOP-PEA8R2PO, 60826, None)
23/07/29 09:48:01 INFO BlockManager: Initialized BlockManager: BlockManagerId(driver, LAPTOP-PEA8R2PO, 60826, None)

Spark——一文理解SparkSQL的DataFrame概念以及操作 阅读详情

相关推荐

Spark SQL实战:使用SparkSession创建DataFrame执行sql

1.需求: 在IDEA中编写代码,创建DataFrame 执行sql命令: 2.数据源: student.txt 1 tom 15 2 lucy 20 3 mike 18 3.编写代码: (1)添加依赖: pom.xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version

Movle 2136

Spark中的DataFrame是什么?以及如何构建DataFrame?(附案例)

在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,是一种特殊的RDD,是一个分布式的表,类似于传统数据库中的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。

奇迹虎虎的博客 1万+

Apache Spark实战指南:从核心概念到生产环境调优

在大数据处理领域,分布式计算框架是处理海量数据的核心技术。其核心原理在于将计算任务分解并分发到多台机器上并行执行,从而突破单机性能瓶颈。这种技术价值在于能够高效处理TB甚至PB级的数据,广泛应用于数据分析、机器学习、实时流处理等场景。Apache Spark作为其中的杰出代表,凭借其内存计算和DAG调度引擎,显著提升了处理性能。本文聚焦于Spark的实战应用,深入探讨RDD、DataFrame等核心抽象,并结合性能调优与数据倾斜等常见工程挑战,提供从环境搭建到生产部署的完整解决方案。

weixin_33946020的博客 331

Spark中DataFrame的schema讲解

代码+图文讲解Spark中DataFrame的schema

RiverCode的博客 1万+

一文彻底搞清楚Spark Schema

Spark Schema定义了DataFrame的结构,可以通过对DataFrame对象调用printSchema()方法来获得该结构。Spark SQL提供了StructType和StructField类以编程方式指定架构。默认情况下,Spark从数据中推断schema,但有时我们可能需要定义自己的schema(列名和数据类型),尤其是在处理非结构化和半结构化数据时,本文通过示例解释了如何定义简单、嵌套和复杂的schema。

SunnyRivers 950

为什么AI时代的优秀组织,都在学习Meta的Pod结构?看完秒懂

当AI技术重塑产业格局,企业协作正面临前所未有的挑战——层级繁琐、跨部门内耗、迭代滞后,传统组织模式早已难以跟上技术革新的步伐。作为全球AI原生企业的标杆,Meta独创的Pod组织模式,用“小而美”的自治单元打破困局,成为AI时代高效协作的典范。本文将从定义、运作、价值到未来演进,全面拆解Pod模式,为企业组织变革提供可参考的思路与路径。德鲁克曾说:“组织的功能就是让平凡的人做平凡的事。”而Meta Pod打破这一局限,通过去中心化、指标导向、跨界融合,让优秀人才产生“化学反应”。

Kiss_AIHR的博客 1178

Spark以反射方式创建DataFrame

package spark.demo.sql import java.util import java.util.{ArrayList, List} import org.apache.spark.sql.types.{DataTypes, StructField, StructType} import org.apache.spark.sql.{RowFactory, SparkSessio...

h_sn9999的专栏 272

【图文步骤】EC-Engineer部分操作详细步骤

EC-Engineer部分功能详细使用手册

weixin_42212468的博客 6173

spark rdd dataframe dataset

RDD RDD(Resilient Distribute Datasets)弹性分布式数据集,是spark的核心概念,表示分布式存储的只读集合,可以基于RDD进行数据的转换操作(map,filter等) Spark通过RDD的抽象概念,实现了分区计算存储、DAG、依赖等编程接口 rdd介绍:https://www.infoq.cn/article/spark-core-rdd RDD vs Dat...

upupfeng的博客 317

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

04 Zabbix自定义触发器

1、触发器是什么 触发器表达式:允许定义一个什么状况的数据是“可接受”的阈值。因此,如果接收的数据超过了可接受的状态,则触发器会被触发 , 或将状态更改为异常。 一个触发器可以拥有下面几种状态: 值 描述 OK 这是一个正常的触发器状态。在旧版本的Zabbix中称为FALSE。 PROBLEM 通常意味着发生了某些事情。例如,处理器的负载较高。在旧版本的Zabbix中称为TRUE。 2、创建触发器TRIGGER 案例:系统超过3个用户登录,则告警。 2.1 开启告警声

Jian Sun_的博客 1541

使用IDEA开发Spark SQL

指定列名添加Schema package SparkSql import org.apache.spark import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession import java.util.Properties import org.apache.avro.ipc.specific.Person ...

登峰造极胡子球手 2706

Cadence OrCAD Capture软件启动过程卡死且无法恢复的解决方法

如下图所示Cadence OrCAD Capture软件在启动后出现卡死的现象,且等待后无法自动恢复,需要强行关闭,再次启动依然卡死。

fydar的博客 4044

Spark SQL读取JSON案例以及存在的坑

Spark可以读取JSON,将其转换为DataFrame ( DataFrame[Row] ) Spark SQL可以自动推断JSON的schema,但是如果显式的提供模式可以避免额外的扫描 需要注意是:如果是读取JSON文件,提供的json文件不是典型的JSON文件,而是每行属于合法的JSON,然后用分隔符分割,具体规则:http://jsonlines.org/ 官网Demo地址:http:/...

upupfeng的博客 4493

软件需求规格说明书(SRS)标准模板

《软件需求规格说明书(SRS)框架解析》摘要: 本文档系统阐述了SRS的标准结构,包含7大核心部分:1)引言(目的、背景和术语);2)总体描述(产品定位与用户特征);3)功能需求(模块化功能说明);4)非功能需求(性能、安全等指标);5)接口需求(用户/硬件/软件接口);6)其他技术要求;7)附录(图表与参考资料)。重点突出了功能需求模块的标准化描述模板(FR-01),以及安全需求中的HTTPS通信、SHA-256加密等关键指标。该框架为软件开发提供了明确的需求基准,涵盖从业务背景到技术实现的完整链条,是确

moton2017的博客 2893

水与光的奇妙“切割之舞”:水导激光切割技术探秘

水导激光切割技术的诞生,是材料加工领域不断追求高精度、高质量加工的成果。传统激光切割技术在加工过程中,材料会因瞬间高温而产生热变形、热影响区大以及切割面粗糙等问题,这些弊端在对一些高精度、热敏性材料的加工中尤为突出 ,迫切需要一种新的技术来克服这些难题。水导激光切割技术的起源可以追溯到 20 世纪 80 年代。1986 年,德国公司 Aesculap-Werke AG 首次提出了将水流引入激光切割过程的创新想法,并制造出首代水导激光设备。不过,当时的技术尚处于雏形阶段,仅仅是在光纤出口添加了一小柱水流,激光

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1674

Spark 4.x variant类型详解:告别schema束缚,高效处理半结构化JSON

在大数据开发中,面对接口返回的嵌套JSON和动态字段,传统处理方式往往陷入两难:StringType存储导致查询时反复解析,Struct类型则要求预先定义schema,频繁变更字段让ETL维护成本居高不下。Spark 4.x引入的variant数据类型,为半结构化数据处理提供了第三种选择。它像JSONB一样以紧凑的二进制格式存储JSON,无需预先定义schema,写入时无需严格类型匹配,查询时通过惰性解析按需提取字段,显著提升嵌套字段的查询性能。本文从数据类型本质出发,解析variant与StringTyp

weixin_34166847的博客 330

2026年数字IC设计华为笔试带答案解析

这篇文章是一份数字IC设计工程师笔试的试卷结构和部分题目解析。试卷包含单选题31题(每题2分)、多选题10题(每题4分)和简答/编程题4题(每题7分),总分130分,考试时长120分钟。 摘要重点: 试卷涵盖数字IC设计的关键知识点,包括Verilog语法、时序逻辑、状态机设计、跨时钟域处理等; 题目解析详细说明了各选项的正确性,如非阻塞赋值特性(D错误)、功耗影响因素(C与组合逻辑级数弱相关)等; 包含实际工程问题,如DDR4接口电平(SSTL-1.2)、卡诺图变量排序(格雷码)等; 部分题目考察基础概念

Open 372

Spark SQL 2.4.8 操作 Dataframe

Spark SQL 2.4.8 操作 Dataframe一、测试数据二、创建DataFrame方式一:DSL方式操作方式二:SQL方式操作 一、测试数据 7369,SMITH,CLERK,7902,1980/12/17,800,20 7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30 7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30 7566,JONES,MANAGER,7839,1981/4/2,2975,20 765

聚焦大数据、AI、数据库三大核心领域,分享 Flink/Spark 实时计算、数仓架构设计、AI 模型落地、数据库性能调优的实战干货,附可直接运行的源码与方案。提供企业技术内训、项目咨询与定制化服务,助力开发者与企业高效搞定数智技术难题。 677

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spark DataFrame日期格式问题

背景 US和UK的5日之后的PLA数据都没有存入ES,后来发现是日期格式不符合。 读取的时候,已经是timestamp类型了(见如下dataFrame.printSchema) 现在关键是DataFrame和CSV的格式转换问题 看来要显示转换比较靠谱 val userBiddingResultSchema = FbUserBiddingResultPojo.structType ......

郑泽洲的博客 4644

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

sparksession创建DataFrame方式

spark创建dataFrame方式有很多种 一:通过类反射机制 举两个例子 1.通过List<java bean>创建dataFrame /** * Applies a schema to a List of Java Beans. * * WARNING: Since there is no guaranteed ordering ...

diaoxie5099的博客 2550

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Spark DataFrame及RDD与DataSet转换成DataFrame

一、什么是DataFrame         DataFrame和RDD一样,也是Spark的一种弹性分布式数据集,它是一个由列组成的数据集,概念上等同于关系型数据库中的一张表。DataFrame可以从非常宽泛的数据源中的构建,比如结构化的数据文件,Hive中的表,外部数据库,或者已经创建好的RDDs等等。在Scala和Java中,DataFrame由行数据集表示。在Scala API中,Dat...

L 2463

读取文件转为带有Schema的DataFrame

楔子 spark读取文件转为DataSet /** * 读取文件,转为Dataset * * @param sparkSession * @param filePath * 文件路劲 * @param schemaString * 字段分隔符是逗号 * @param fileSplit * 文件字段分隔符 ...

zhuzi51的专栏 512

spark sql demo

通过pojo构造table: package sparkSql; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.func

liben2007的博客 783

【Spark 】完整知识体系:从入门到生产调优

Spark 3.5是现代大数据处理的核心引擎,核心为Spark SQL,推荐使用DataFrame/Dataset API(Python仅支持DataFrame)。其性能关键在于Catalyst优化器,实现自动逻辑与物理优化、代码生成。数据源首选Parquet,支持多种格式读写。编程风格可选DSL链式调用或SQL字符串,后者需注册临时视图。理解Transformation惰性求值与Action触发执行是掌握Spark的关键。避免学习过时的RDD,专注高效、声明式的数据处理。

zy123456nn的博客 489

Spark RDD、DataFrame、DataSet核心区别与选型指南

Spark的三大数据抽象——RDD、DataFrame和DataSet,本质是面向不同开发范式与运行时约束的编程契约。RDD提供底层JVM控制力,适合自定义序列化与内存操作;DataFrame依托Catalyst优化器实现SQL级自动优化与谓词下推,兼顾易用性与性能;DataSet则通过ExpressionEncoder实现编译期类型安全与Tungsten堆外内存高效访问。三者并非线性演进关系,而是在类型检查强度、优化可见性、序列化机制及语言支持维度上形成明确权衡。实际工程中需依据是否需SQL交互、是否强依

weixin_29040367的博客 217
上一篇: 安装 CDH执行scm_prepare_database.sh报错,java.sql.SQLException: Access denied for user ‘scm‘@‘localhost‘
下一篇: 大数据处理框架-Spark DataFrame构造、join和null空值填充
数智客栈
博客等级 码龄17年 5699粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值