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.