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

问题描述 投票:0回答:5

我有一个包含多个工作表的大

Excel(xlsx and xls)
文件,我需要将其转换为
RDD
Dataframe
,以便稍后可以将其连接到其他
dataframe
。我正在考虑使用 Apache POI 并将其保存为
CSV
,然后在
csv
中读取
dataframe
。但如果有任何库或 API 可以帮助这个过程就会很容易。非常感谢任何帮助。

excel scala apache-spark pyspark spark-excel
5个回答
37
投票

问题的解决方案是在项目中使用

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)

如果您的 Excel 工作表有多张工作表,您可以将

sheetname
指定为
option

.option("sheetName", "Sheet2")

希望对你有帮助


14
投票

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

来源 spark-excel 来自 crealytics

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)中访问它们,这会从Excel表中创建
DataFrame
[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 上获取。


3
投票

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


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");

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)
© www.soinside.com 2019 - 2024. All rights reserved.