如何从Scala Spark中的Excel(xls,xlsx)文件构造Dataframe?
我有一个大的Excel(xlsx and xls)
文件与多个工作表,我需要将其转换为RDD
或Dataframe
以便它可以连接到其他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 。