2017-05-26 95 views
5

我有一個大的Excel(xlsx and xls)文件與多個工作表,我需要將其轉換爲RDDDataframe,以便它可以加入到其他dataframe以後。我正在考慮使用Apache POI並將其保存爲CSV,然後在dataframe中讀取csv。但是,如果有任何圖書館或API可以在這個過程中提供幫助,那將很簡單。任何幫助,高度讚賞。如何從Scala Spark的Excel(xls,xlsx)文件構建Dataframe?

+0

檢查這個答案與步驟 新手https://stackoverflow.com/a/47721326/2112382 – vijayraj34

回答

8

解決您的問題的方法是在項目中使用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") 

我希望它有幫助

2

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

+0

您好所有,我們能否用上面的Excel工作表中寫數據到多個標籤? – Bharath

+0

我假設你是指Excel工作簿中的多個工作表。是的,它可以寫入多個工作表。基本上你定義了一個SpreadSheetCellDAO,它指定了格式化值,註釋,公式,地址和表單。但是,爲了更多地支持您,我需要更多地瞭解您的使用案例。隨意提供Github問題的信息:https://github.com/ZuInnoTe/hadoopoffice/issues –

4

這裏有閱讀例子從閱讀和全套選項寫入到Excel ..

來源spark-excel from crealytics

斯卡拉API 星火2.0+:

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

寫數據幀到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中,你可以在上面日報給出的這個例子中使用他們的名字以及.. 是表名稱。

  • 如果你想從火花外殼使用它...

該軟件包可以添加使用--packages命令行選項來的火花。需要添加

$SPARK_HOME/bin/spark-shell --packages com.crealytics:spark-excel_2.11:0.9.8 
  • 相關性(在行家等情況下...)::
groupId: com.crealytics 
artifactId: spark-excel_2.11 
version: 0.9.8 

例如,爲了啓動火花殼時它包括

提示:這是非常有用的方法特別是用於寫入 行家測試情況下,可以放置Excel表與採樣數據在Excel src/main/resources文件夾,並可以在您的單元測試用例(階/爪哇),它創建DataFrame訪問它們[s]的從Excel工作表的...

火花datasourc e用於HadoopOffice庫。這個Spark數據源 至少假設了Spark 2.0.1。但是,HadoopOffice庫也可以直接從Spark 1.x中使用 。目前這款數據源 支持HadoopOffice庫的格式如下:

的Excel數據源格式:舊的Excel(.xls的)和新的Excel的org.zuinnote.spark.office.Excel加載和保存 (.xlsx)格式這個數據源是Spark-packages.orgMaven Central 可用。

相關問題