我有一个Excel(xlsx and xls)
带有多张纸的大文件,我需要将其转换为RDD
或Dataframe
以便以后可以将其连接到其他文件dataframe
。我正在考虑使用Apache POI并将其保存为 aCSV
然后读csv
入dataframe
. 但是,如果有任何库或 API 可以在此过程中提供帮助,那将很容易。非常感谢任何帮助。
5 回答
您的问题的解决方案是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)
你可以给sheetname
,option
好像你的 excel 工作表有多个工作表
.option("sheetName", "Sheet2")
我希望它有帮助
以下是读取和写入带有全套选项的excel的读取和写入示例。..
来自 crealytics 的源spark-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是工作表名称。
- 如果你想从 spark shell 中使用它......
--packages
可以使用命令行选项将此包添加到 Spark 。例如,在启动 spark shell 时包含它:
$SPARK_HOME/bin/spark-shell --packages com.crealytics:spark-excel_2.11:0.13.1
- 需要添加依赖项(如果是 maven 等...):
groupId: com.crealytics artifactId: spark-excel_2.11 version: 0.13.1
进一步阅读:请参阅我的文章(如何使用 Apache Spark、Scala 使用 Excel 工作表进行简单报告?),了解如何在聚合到多个 Excel 工作表后写入 excel 文件
提示:这是非常有用的方法,特别是对于编写 maven 测试用例,您可以将带有示例数据的 excel 表放在 excel
src/main/resources
文件夹中,您可以在单元测试用例(scala/java)中访问它们,这会DataFrame
从 excel 表中创建 [s] ...
- 您可以考虑的另一个选择是 spark-hadoopoffice-ds
HadoopOffice 库的 Spark 数据源。此 Spark 数据源至少假定 Spark 2.0.1。但是,HadoopOffice 库也可以直接从 Spark 1.x 中使用。目前该数据源支持以下格式的 HadoopOffice 库:
Excel 数据源格式:
org.zuinnote.spark.office.Excel
旧 Excel (.xls) 和新 Excel (.xlsx) 的加载和保存 此数据源可在Spark-packages.org和Maven Central上获得。
或者,您可以使用 HadoopOffice 库 ( https://github.com/ZuInnoTe/hadoopoffice/wiki ),它还支持加密的 Excel 文档和链接的工作簿,以及其他功能。当然也支持 Spark。
希望这会有所帮助。
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)
我使用了 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");