如何从Scala Spark中的Excel(xls,xlsx)文件构造Dataframe?

我有一个大的Excel(xlsx and xls)文件与多个工作表,我需要将其转换为RDDDataframe以便它可以连接到其他dataframe Dataframe稍后。 我正在考虑使用Apache POI并将其保存为CSV ,然后在dataframe读取csv 。 但是,如果有任何图书馆或API可以帮助在这个过程中很容易。 任何帮助,高度赞赏。

解决您的问题的方法是在您的项目中使用Spark Excel依赖项。

Spark Excel有灵活的options可供使用。

我已经testing了下面的代码从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工作表有多个工作表,您可以将工作表名称作为option

 .option("sheetName", "Sheet2") 

我希望它有帮助

或者,您可以使用HadoopOffice库( https://github.com/ZuInnoTe/hadoopoffice/wiki ),该库还支持encryption的Excel文档和链接的工作簿以及其他function。 当然Spark也支持。

这里有读写示例来读取和写入excel 的全套选项。 ..

源自crealytics的spark-excel

Scala API Spark 2.0+:

从Excel文件创build一个DataFrame

 import org.apache.spark.sql.SQLContext val sqlContext = new SQLContext(sc) val df = sqlContext.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") 

写一个数据框到Excel文件

 df.write .format("com.crealytics.spark.excel") .option("sheetName", "Daily") .option("useHeader", "true") .option("dateFormat", "yy-mmm-d") // Optional, default: yy-md 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。 例如,要在启动火狐shell时包含它:

 $SPARK_HOME/bin/spark-shell --packages com.crealytics:spark-excel_2.11:0.9.8 
  • 需要添加依赖(如果是maven等):
 groupId: com.crealytics artifactId: spark-excel_2.11 version: 0.9.8 

提示:这非常有用,特别适用于编写maventesting用例,您可以在excel src/main/resources文件夹中放置带有示例数据的Excel表格,并且可以在unit testing用例(scala / java)中访问它们,从而创buildDataFrame [ s]出excel表单…

  • 你可以考虑的另一个select是spark-hadoopoffice-ds

HadoopOffice库的Spark数据源。 这个Spark数据源至less假定了Spark 2.0.1。 但是,HadoopOffice库也可以直接从Spark 1.x中使用。 目前这个数据源支持HadoopOffice库的以下格式:

Excel数据源格式: org.zuinnote.spark.office.Excel加载和保存旧的Excel(.xls)和新的Excel(.xlsx)这个数据源可以在Spark-packages.org和Maven Central上find 。