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

时间:2017-05-26 08:13:09

标签: excel scala apache-spark apache-spark-sql

我有一个包含多个工作表的大型Excel(xlsx and xls)文件,我需要将其转换为RDDDataframe,以便以后可以将其加入其他dataframe。我在考虑使用Apache POI并将其另存为CSV,然后在csv中阅读dataframe。但是,如果有任何库或API可以帮助这个过程很容易。任何帮助都非常感谢。

5 个答案:

答案 0 :(得分: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)

如果您的Excel工作表有多张

,则可以sheetnameoption
.option("sheetName", "Sheet2")

我希望它有用

答案 1 :(得分:6)

这里有读取示例,可以通过完整的选项集读取和写入excel ..

来源spark-excel from crealytics

Scala API Spark 2.0 +:

从Excel文件创建DataFrame

vendorID

将DataFrame写入Excel文件

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

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

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

可以使用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") 命令行选项将此包添加到Spark。例如,要在启动spark shell时包含它:

--packages
  • 需要添加依赖关系(如果是maven等......):
$SPARK_HOME/bin/spark-shell --packages com.crealytics:spark-excel_2.11:0.9.8
  

提示: 这是非常有用的方法,尤其适合写作   maven测试用例,您可以在excel中放置包含样本数据的Excel工作表   groupId: com.crealytics artifactId: spark-excel_2.11 version: 0.9.8 文件夹,您可以在单元测试用例(scala / java)中访问它们,这会从Excel工作表中创建src/main/resources [s] ...

  

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

     

Excel数据源格式:DataFrame正在加载和   保存旧的Excel(.xls)和新的Excel(.xlsx)此数据源是   可在Spark-packages.orgMaven Central上找到。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我使用了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");

答案 4 :(得分:0)

希望这会有所帮助。

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)