在scala中使用sparkSQL读入csv文件

news2025/5/15 22:52:35

以下是使用 Spark SQL(Scala)读取 CSV 文件的完整代码示例:

scala

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._

object CSVReadExample {
  def main(args: Array[String]): Unit = {
    // 创建SparkSession
    val spark = SparkSession.builder
      .appName("CSVReadExample")
      .config("spark.master", "local[*]")
      .getOrCreate()

    try {
      // 方法1:自动推断模式
      val df1 = spark.read
        .option("header", "true")  // 第一行是否包含列名
        .option("inferSchema", "true")  // 自动推断数据类型
        .csv("path/to/your/file.csv")

      println("方法1:自动推断模式")
      df1.printSchema()
      df1.show()

      // 方法2:指定自定义模式
      val customSchema = StructType(Array(
        StructField("id", IntegerType, nullable = true),
        StructField("name", StringType, nullable = true),
        StructField("age", IntegerType, nullable = true),
        StructField("salary", DoubleType, nullable = true)
      ))

      val df2 = spark.read
        .option("header", "true")
        .schema(customSchema)  // 使用自定义模式
        .csv("path/to/your/file.csv")

      println("方法2:指定自定义模式")
      df2.printSchema()
      df2.show()

      // 方法3:读取多文件
      val df3 = spark.read
        .option("header", "true")
        .csv("path/to/your/files/*.csv")  // 读取目录下所有CSV文件

      println("方法3:读取多文件")
      df3.count()
      df3.show()

      // 执行SQL查询示例
      df2.createOrReplaceTempView("people")
      val result = spark.sql("SELECT name, age FROM people WHERE age > 30")
      result.show()

    } catch {
      case e: Exception =>
        println(s"读取CSV失败: ${e.getMessage}")
        e.printStackTrace()
    } finally {
      // 关闭SparkSession
      spark.stop()
    }
  }
}

常用 CSV 读取选项:

scala

spark.read
  .option("header", "true")  // 是否有表头
  .option("delimiter", ",")  // 分隔符,默认为逗号
  .option("quote", "\"")    // 引号字符,默认为双引号
  .option("escape", "\\")   // 转义字符
  .option("nullValue", "null")  // 指定空值表示
  .option("dateFormat", "yyyy-MM-dd")  // 日期格式
  .option("inferSchema", "true")  // 是否自动推断模式
  .csv("path/to/file.csv")

处理特殊情况:

  1. 处理引号包含的分隔符

    scala

    .option("quote", "\"")
    .option("escape", "\"")
    
  2. 处理包含换行符的字段

    scala

    .option("multiline", "true")
    
  3. 处理不同编码的文件

    scala

    .option("charset", "UTF-8")
    

执行步骤:

  1. 准备示例 CSV 文件 people.csv

    csv

    id,name,age,salary
    1,Alice,25,5000.0
    2,Bob,30,6000.0
    3,Charlie,35,7500.0
    
  2. 运行 Spark 应用:

    bash

    spark-submit --class CSVReadExample \
      --master local[*] \
      your-application.jar
    
  3. 也可以在 Spark Shell 中交互式运行:

    bash

    spark-shell
    
     

    然后粘贴代码片段执行

性能优化建议:

  1. 禁用自动推断模式(如果已知模式):

    scala

    .schema(customSchema)
    .option("inferSchema", "false")  // 提高性能
    
  2. 分区并行读取

    scala

    // 增加分区数提高并行度
    val df = spark.read.csv("path/to/file.csv").repartition(10)
    
  3. 使用列剪枝

    scala

    // 只选择需要的列
    df.select("name", "age")
    
  4. 过滤数据

    scala

    // 尽早过滤数据减少内存占用
    df.filter($"age" > 30)
    

错误处理:

  1. 处理格式错误

    scala

    .option("mode", "DROPMALFORMED")  // 丢弃格式错误的记录
    .option("mode", "PERMISSIVE")    // 将错误字段设为null
    .option("mode", "FAILFAST")      // 遇到错误立即失败
    
  2. 自定义错误处理

    scala

    import org.apache.spark.sql.Row
    
    val df = spark.read.csv("path/to/file.csv")
    val validRows = df.rdd.filter { row =>
      try {
        // 自定义验证逻辑
        row.getString(1).length > 0
      } catch {
        case e: Exception => false
      }
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ 核心概念与消息模型深度解析(一)

一、RabbitMQ 是什么 在当今分布式系统盛行的时代,消息队列作为一种至关重要的中间件技术,扮演着实现系统之间异步通信、解耦和削峰填谷等关键角色 。RabbitMQ 便是消息队列领域中的佼佼者,是一个开源的消息代理和队列服务器,基于…

论文阅读笔记——双流网络

双流网络论文 视频相比图像包含更多信息:运动信息、时序信息、背景信息等等。 原先处理视频的方法: CNN LSTM:CNN 抽取关键特征,LSTM 做时序逻辑;抽取视频中关键 K 帧输入 CNN 得到图片特征,再输入 LSTM&…

LabVIEW在电子电工教学中的应用

在电子电工教学领域,传统教学模式面临诸多挑战,如实验设备数量有限、实验过程存在安全隐患、教学内容更新滞后等。LabVIEW 作为一款功能强大的图形化编程软件,为解决这些问题提供了创新思路,在电子电工教学的多个关键环节发挥着重…

Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标

1、定义icon组件代码&#xff1a; <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…

生活破破烂烂,AI 缝缝补补(附提示词)

写在前面&#xff1a;​【Fire 计算器】已上线&#xff0c;快算算财富自由要多少​ 现实不总温柔&#xff0c;愿你始终自渡。 请永远拯救自己于水火之中。 毛绒风格提示词&#xff08;供参考&#xff09;&#xff1a; 1. 逼真毛绒风 Transform this image into a hyperrealist…

张 。。 通过Token实现Loss调优prompt

词编码模型和 API LLM不匹配,采用本地模型 理性中性案例(针对中性调整比较合理) 代码解释:Qwen2模型的文本编码与生成过程 这段代码展示了如何使用Qwen2模型进行文本的编码和解码操作。 模型加载与初始化 from transformers import AutoModelForCausalLM, AutoTokenizer

JVM学习专题(一)类加载器与双亲委派

目录 1、JVM加载运行全过程梳理 2、JVM Hotspot底层 3、war包、jar包如何加载 4、类加载器 我们来查看一下getLauncher&#xff1a; 1.我们先查看getExtClassLoader() 2、再来看看getAppClassLoader(extcl) 5、双亲委派机制 1.职责明确&#xff0c;路径隔离​&#xff…

PyTorch API 9 - masked, nested, 稀疏, 存储

文章目录 torch.randomtorch.masked简介动机什么是 MaskedTensor&#xff1f; 支持的运算符一元运算符二元运算符归约操作查看与选择函数 torch.nested简介构造方法数据布局与形状支持的操作查看嵌套张量的组成元素填充张量的相互转换形状操作注意力机制 与 torch.compile 的配…

进程相关面试题20道

一、基础概念与原理 1.进程的定义及其与程序的本质区别是什么&#xff1f; 答案&#xff1a;进程是操作系统分配资源的基本单位&#xff0c;是程序在数据集合上的一次动态执行过程。核心区别&#xff1a;​ 动态性&#xff1a;程序是静态文件&#xff0c;进程是动态执行实例…

Linux复习笔记(五) 网络服务配置(dhcp)

二、网络服务配置 2.5 dhcp服务配置&#xff08;不涉及实际操作&#xff09; 要求&#xff1a;知道原理和常见的参数配置就行 2.5.1 概述DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; DHCP&#xff08;Dynamic Host Conf…

windows版redis的使用

redis下载 Releases microsoftarchive/redishttps://github.com/microsoftarchive/redis/releases redis的启动和停止 进入路径的cmd 启动&#xff1a;redis-server.exe redis.windows.conf 停止&#xff1a;ctrlc 连接redis 指定要连接的IP和端口号 -h IP地址 -p 端口…

Java版OA管理系统源码 手机版OA系统源码

Java版OA管理系统源码 手机版OA系统源码 一&#xff1a;OA系统的主要优势 1. 提升效率 减少纸质流程和重复性工作&#xff0c;自动化处理常规事务&#xff0c;缩短响应时间。 2. 降低成本 节省纸张、打印、通讯及人力成本&#xff0c;优化资源分配。 3. 规范管理 固化企…

NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级

NineData 社区版 V4.1.0 正式更新发布。本次通过新增 4 条迁移链路扩展、国产数据库深度适配、敏感数据保护增强‌等升级&#xff0c;进一步巩固了其作为高效、安全、易用的数据管理工具的定位。无论是开发测试、数据迁移&#xff0c;还是多环境的数据管理&#xff0c;NineData…

进阶2_1:QT5多线程与定时器共生死

1、在widget.ui中使用 LCD Number控件 注意&#xff1a;若 LCD 控件不是多线程&#xff0c;LCD控件则会瞬间自增到最大的数值&#xff0c;如上图&#xff0c;说明两者都是多线程处理 2、实现方式 1、创建 LCD 控件并修改为 LCD1 2、创建任务类 mytask. h&#xff0c;对任务类…

在虚拟机Ubuntu18.04中安装NS2教程及应用

NS2简介 一、主要组成部分&#xff1a; 1.NS2&#xff1a;模拟器本身&#xff0c;负责执行TCL脚本进行模拟&#xff0c;并生成trace文件输出结果。 2.NAM&#xff1a;网络动画模拟器&#xff0c;用于将模拟结果可视化。 二、使用的语言&#xff1a; 1.C&#xff1a;NS2中最重要…

VBA —— 第6章子程序与函数

子程序&#xff1a;实现特定功能的程序代码块 子程序语法&#xff1a; [修饰符] Sub 子程序名称([参数1&#xff0c;参数2&#xff0c;参数3]) 代码块 End Sub 子程序如何调用&#xff1a; 1 . 子程序名 [参数1&#xff0c;参数2&#xff0c;...] 2. Call 子程序名 [(参…

全新开发-iVX图形化编程VS完整IDE

本文针对传统软件开发的效率与可控性矛盾&#xff0c;系统阐释 iVX"图形化编程 全栈 IDE" 的复合架构如何突破行业瓶颈。通过 "可视化建模 - 标准代码生成 - 独立运行" 的技术闭环&#xff0c;iVX 实现开发效率提升 60% 与源码完全可控的双重目标。研究揭…

【Linux系列】跨平台安装与配置 Vim 文本编辑器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

十天学会嵌入式技术之51单片机—day-10

第 20 章 18B20 温度检测 20.1 18B20 概述 20.1.1 简介 18B20 是一种常用的数字温度传感器&#xff0c;广泛应用于环境监测、工业控制、家居自动化 和设备温度监控等领域。 20.1.2 引脚功能 18B20 引脚功能如下图所示&#xff0c;需要特别强调的是&#xff0c;18B20 采用 1-…

【C++】17. 多态

上一章节中我们讲了C三大特性的继承&#xff0c;这一章节我们接着来讲另一个特性——多态 1. 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)&#xff0c;这里我们重点讲运行时多态…