我有一个包含多个工作表的大型Excel(xlsx and xls)
文件,我需要将其转换为RDD
或Dataframe
,以便以后可以将其加入其他dataframe
。我在考虑使用Apache POI并将其另存为CSV
,然后在csv
中阅读dataframe
。但是,如果有任何库或API可以帮助这个过程很容易。任何帮助都非常感谢。
答案 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工作表有多张
,则可以sheetname
为option
.option("sheetName", "Sheet2")
我希望它有用
答案 1 :(得分:6)
这里有读取和写示例,可以通过完整的选项集读取和写入excel 。 ..
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
$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.org和Maven 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)