15

我有一个Excel(xlsx and xls)带有多张纸的大文件,我需要将其转换为RDDDataframe以便以后可以将其连接到其他文件dataframe。我正在考虑使用Apache POI并将其保存为 aCSV然后读csvdataframe. 但是,如果有任何库或 API 可以在此过程中提供帮助,那将很容易。非常感谢任何帮助。

4

5 回答 5

33

您的问题的解决方案是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)

你可以给sheetnameoption好像你的 excel 工作表有多个工作表

.option("sheetName", "Sheet2")

我希望它有帮助

于 2017-05-26T08:53:51.843 回答
12

以下是读取和写入带有全套选项的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] ...

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上获得。

于 2017-12-15T07:21:51.923 回答
3

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

于 2017-06-22T17:39:06.297 回答
1

希望这会有所帮助。

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)
于 2020-02-23T13:43:02.457 回答
1

我使用了 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");
于 2019-06-18T05:07:33.703 回答