我有一个包含多个工作表的大
Excel(xlsx and xls)
文件,我需要将其转换为RDD
或Dataframe
,以便稍后可以将其连接到其他dataframe
。我正在考虑使用 Apache POI 并将其保存为 CSV
,然后在 csv
中读取 dataframe
。但如果有任何库或 API 可以帮助这个过程就会很容易。非常感谢任何帮助。
问题的解决方案是在项目中使用
Spark Excel
依赖项。
Spark Excel 具有灵活的
options
可供使用。
我已经测试了以下代码以从
excel
读取并将其转换为 dataframe
,它工作得非常完美
def readExcel(file: String): DataFrame = sqlContext.read
.format("com.crealytics.spark.excel")
.option("location", file)
.option("useHeader", "true")
.option("treatEmptyValuesAsNulls", "true")
.option("inferSchema", "true")
.option("addColorColumns", "False")
.load()
val data = readExcel("path to your excel file")
data.show(false)
如果您的 Excel 工作表有多张工作表,您可以将
sheetname
指定为 option
.option("sheetName", "Sheet2")
希望对你有帮助
这里有 read 和 write 读取和写入 excel 的示例 以及全套选项。..
Scala API Spark 2.0+:
从 Excel 文件创建 DataFrame
import org.apache.spark.sql._
val spark: SparkSession = ???
val df = spark.read
.format("com.crealytics.spark.excel")
.option("sheetName", "Daily") // Required
.option("useHeader", "true") // Required
.option("treatEmptyValuesAsNulls", "false") // Optional, default: true
.option("inferSchema", "false") // Optional, default: false
.option("addColorColumns", "true") // Optional, default: false
.option("startColumn", 0) // Optional, default: 0
.option("endColumn", 99) // Optional, default: Int.MaxValue
.option("timestampFormat", "MM-dd-yyyy HH:mm:ss") // Optional, default: yyyy-mm-dd hh:mm:ss[.fffffffff]
.option("maxRowsInMemory", 20) // Optional, default None. If set, uses a streaming reader which can help with big files
.option("excerptSize", 10) // Optional, default: 10. If set and if schema inferred, number of rows to infer schema from
.schema(myCustomSchema) // Optional, default: Either inferred schema, or all columns are Strings
.load("Worktime.xlsx")
将 DataFrame 写入 Excel 文件
df.write
.format("com.crealytics.spark.excel")
.option("sheetName", "Daily")
.option("useHeader", "true")
.option("dateFormat", "yy-mmm-d") // Optional, default: yy-m-d h:mm
.option("timestampFormat", "mm-dd-yyyy hh:mm:ss") // Optional, default: yyyy-mm-dd hh:mm:ss.000
.mode("overwrite")
.save("Worktime2.xlsx")
注意:您也可以使用它们的名称来代替sheet1或sheet2。 在上面给出的示例中,Daily 是工作表名称。
可以使用
--packages
命令行选项将此包添加到 Spark。例如,在启动 Spark shell 时包含它:
$SPARK_HOME/bin/spark-shell --packages com.crealytics:spark-excel_2.11:0.13.1
groupId: com.crealytics artifactId: spark-excel_2.11 version: 0.13.1
进一步阅读:请参阅我的文章(如何使用 Apache Spark、Scala 使用 Excel 工作表进行简单报告?)了解如何在聚合到多个 excel 工作表后写入 excel 文件
提示:这是非常有用的方法,特别是对于写作 Maven 测试用例,您可以在 Excel 中放置带有示例数据的 Excel 工作表
文件夹,您可以在单元测试用例(scala / java)中访问它们,这会从Excel表中创建src/main/resources
[s]...DataFrame
HadoopOffice 库的 Spark 数据源。此 Spark 数据源 假设至少是 Spark 2.0.1。然而,HadoopOffice 库可以 也可以直接从 Spark 1.x 使用。目前这个数据源 支持 HadoopOffice 库的以下格式:
Excel 数据源格式:
加载和 保存旧 Excel (.xls) 和新 Excel (.xlsx) 此数据源是 可在 Spark-packages.org 和 Maven Central 上获取。org.zuinnote.spark.office.Excel
或者,您可以使用 HadoopOffice 库 (https://github.com/ZuInnoTe/hadoopoffice/wiki),它还支持加密的 Excel 文档和链接的工作簿以及其他功能。当然Spark也支持。
我使用了com.crealytics.spark.excel-0.11版本jar并在spark-Java中创建,在scala中也是一样,只需将javaSparkContext更改为SparkContext即可。
tempTable = new SQLContext(javaSparkContxt).read()
.format("com.crealytics.spark.excel")
.option("sheetName", "sheet1")
.option("useHeader", "false") // Required
.option("treatEmptyValuesAsNulls","false") // Optional, default: true
.option("inferSchema", "false") //Optional, default: false
.option("addColorColumns", "false") //Required
.option("timestampFormat", "MM-dd-yyyy HH:mm:ss") // Optional, default: yyyy-mm-dd hh:mm:ss[.fffffffff] .schema(schema)
.schema(schema)
.load("hdfs://localhost:8020/user/tester/my.xlsx");
希望这会有所帮助。
val df_excel= spark.read.
format("com.crealytics.spark.excel").
option("useHeader", "true").
option("treatEmptyValuesAsNulls", "false").
option("inferSchema", "false").
option("addColorColumns", "false").load(file_path)
display(df_excel)