当前位置: 首页 > news >正文

Spark操作Excel最佳实践

Spark操作Excel最佳实践

      • 1、背景描述
      • 2、Apache POI与Spark-Excel
        • 2.1、Apache POI简介
        • 2.2、Spark-Excel简介
      • 3、Spark读取Excel
        • 3.1、导入依赖
        • 3.2、使用Apache POI
        • 3.3、使用Spark-Excel




1、背景描述


数据开发中通常会涉及到Excel的处理。Java和Apache Spark都不支持读取Excel文件,除了使用Python外,Spark操作Excel一般有两个框架:Apache POI和Spark-Excel

2、Apache POI与Spark-Excel

2.1、Apache POI简介

Apache POI(Poor Obfuscation Implementation)是Apache软件基金会的一个开源项目,提供了用于读写Microsoft Office格式文件(如Word、Excel、PowerPoint)的Java API

POI虽然支持多种文档格式的读写,但是我们最常用的还是对Excel文件的读写。POI技术使得Java开发人员能够轻松地操作和处理Office文档,它为我们提供了丰富的功能和灵活性

Apache POI针对Excel文件的读写提供了三个API:

  • HSSF:HSSF是POI项目对Excel 1997~2007文件格式(xls)的纯Java实现
  • XSSF:XSSF是POI项目对Excel 2007 OOXML文件格式(xlsx)的纯Java实现
  • SXSSF:SXSSF是XSSF的API兼容流扩展,可用于非常大的电子表格且堆空间有限的情况。SXSSF通过限制对滑动窗口内的行的访问来实现其低内存占用

API中的对象及解释如下:

  • Workbook:工作簿
  • Sheet:工作表
  • Row:行
  • Cell:单元格

Apache POI官网:http://poi.apache.org/index.html

Apache POI官方文档:https://poi.apache.org/apidocs/index.html

2.2、Spark-Excel简介

Spark-Excel是一个强大的开源库,‌专为Apache Spark设计,‌用于在大数据环境中高效地读取、‌写入和操作Excel文件。‌该项目由Crealytics团队开发并维护,‌为那些需要在大规模数据分析中与Excel文件打交道的用户提供了一种灵活而高效的选择

Spark-Excel无缝集成了Apache Spark框架,‌允许用户直接在DataFrame或Dataset上操作Excel数据,‌无需先将其转换为其他格式。‌它充分利用了Spark的分布式计算能力,‌能够处理大规模的数据集

Spark-Excel内部使用了流行的Apache POI库来解析和生成Excel文件,‌提供了对老版本(‌xls)‌和新版本(‌xlsx)‌的兼容性,‌并支持复杂的Excel特性,‌例如表格样式、‌公式和超链接等

Spark-Excel实现了高效的内存管理和缓存策略,‌减少了不必要的磁盘IO,‌提高了整体性能。‌对于大型数据集,‌它可以分块读写,‌避免一次性加载整个文件导致的内存压力

Spark-Excel官方文档:https://index.scala-lang.org/crealytics/spark-excel

3、Spark读取Excel

3.1、导入依赖

首先导入所需依赖。除了Spark-Core、Spark-SQL和Spark-Hive依赖外,本次使用到的其它核心依赖如下:

<!-- Java-Excel依赖 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<!-- Spark-Excel依赖 -->
<dependency><groupId>com.crealytics</groupId><artifactId>spark-excel_2.12</artifactId><version>0.13.7</version>
</dependency>
<!--单元测试-->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version>
</dependency>
3.2、使用Apache POI

可以使用Apache POI先将Excel文件转换成CSV或TXT文件,然后再使用Spark读取CSV或TXT文件

为方便使用,我们封装Apache POI读取和转换Excel文件的工具类POIUtils.java

1)工具类POIUtils.java

package com.cc;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Lis

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 66.Python-web框架-Django-免费模板django-datta-able的分页的一种方式
  • Java核心技术【十八】Java集合框架精讲:List、Set、Map
  • disql使用
  • 白底图怎么拍?白底图一键生成!除了前期拍摄,主要少了专业软件
  • 使用requests爬取拉勾网python职位数据
  • go-redis源码解析:连接池原理
  • 请编写函数,判断一字符串是否是回文,若是回文函数返回值为1,否则返回值为0,回文是顺读和倒读都一样的字符串
  • 代码随想录算法训练营第30天 | 第八章 贪心算法05
  • kubernetes集群证书过期问题解决
  • 【二】Ubuntu24虚拟机在Mac OS的VMware Fusion下无法联网问题
  • C#用链表和数组分别实现堆栈
  • AE-图层
  • 数据泄露时代的安全之道:访问认证的重要性
  • [leetcode hot 150]第二十三题,合并K个升序链表
  • SMU Summer 2024 Contest Round 2
  • 【Linux系统编程】快速查找errno错误码信息
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angularjs之国际化
  • CentOS 7 修改主机名
  • fetch 从初识到应用
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript设计模式与开发实践系列之策略模式
  • JavaScript中的对象个人分享
  • k个最大的数及变种小结
  • PHP的类修饰符与访问修饰符
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • python学习笔记 - ThreadLocal
  • Spark RDD学习: aggregate函数
  • springMvc学习笔记(2)
  • windows-nginx-https-本地配置
  • 安卓应用性能调试和优化经验分享
  • 编写符合Python风格的对象
  • 给初学者:JavaScript 中数组操作注意点
  • 基于HAProxy的高性能缓存服务器nuster
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端自动化解决方案
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 入门级的git使用指北
  • 通过npm或yarn自动生成vue组件
  • 网页视频流m3u8/ts视频下载
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习JavaScript数据结构与算法 — 树
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • %@ page import=%的用法
  • (C11) 泛型表达式
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (搬运以学习)flask 上下文的实现
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (回溯) LeetCode 77. 组合
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十一)图像的罗伯特梯度锐化
  • (四)事件系统
  • (贪心 + 双指针) LeetCode 455. 分发饼干