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

Sha*_*ala 10 excel scala apache-spark apache-spark-sql

我有一个Excel(xlsx and xls)包含多个工作表的大文件,我需要将其转换为RDD或者Dataframe以后可以将其连接到其他工作表dataframe.我正在考虑使用Apache POI并将其保存为a CSV然后读csvdataframe.但是,如果有任何库或API可以帮助这个过程很容易.任何帮助都非常感谢.

Ram*_*jan 19

您的问题的解决方案是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)
Run Code Online (Sandbox Code Playgroud)

你可以给sheetnameoption,如果你的Excel工作表中有多个工作表

.option("sheetName", "Sheet2")
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助

  • “sheetName”不再起作用。您必须使用“dataAddress” - https://github.com/crealytics/spark-excel/issues/118 (2认同)

Ram*_*ram 6

以下是读取写入示例,用于读取和写入带有完整选项的 excel ...

来自crealytics的来源spark-excel

Scala API Spark 2.0+:

从Excel文件创建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")
Run Code Online (Sandbox Code Playgroud)

将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")
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用其名称来代替sheet1或sheet2 ..在上面给出的示例中,每日是工作表名称.

  • 如果你想从火花壳中使用它......

可以使用--packages命令行选项将此包添加到Spark .例如,要在启动spark shell时包含它:

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

提示:这是非常有用的方法,特别是对于编写maven测试用例,您可以在excelsrc/main/resources文件夹中放置带有示例数据的excel表, 并且可以在单元测试用例(scala/java)中访问它们,这会创建DataFrameexcel表中的[s] ...

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

Excel数据源格式:org.zuinnote.spark.office.Excel加载和保存旧Excel(.xls)和新Excel(.xlsx)此数据源可在Spark-packages.orgMaven Central上获得.