複数のシートを含む大きなExcel(xlsx and xls)
ファイルがあり、後で他のRDD
と結合できるように、Dataframe
またはdataframe
に変換する必要があります。 Apache POI を使用してCSV
として保存し、csv
でdataframe
を読み取ることを考えていました。ただし、このプロセスに役立つライブラリまたはAPIがあれば簡単です。どんな助けも大歓迎です。
問題の解決策は、プロジェクトで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")
お役に立てば幸いです
以下は、readとwriteExcelの読み取りと書き込みの例の完全なセットですoptions。..
Scala API Spark 2.0 +:
ExcelファイルからDataFrameを作成
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")
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はシート名です。
このパッケージは、--packages
コマンドラインオプションを使用してSparkに追加できます。たとえば、spark Shell
$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シートを配置できるMavenテストケースを作成する場合に特に便利なアプローチです。 Excel
src/main/resources
フォルダー内のサンプルデータと単体テストケース(scala/Java)でアクセスでき、ExcelシートからDataFrame
[s]が作成されます...
A Spark HadoopOfficeライブラリのデータソース。このSparkデータソースは、少なくともSpark 2.0.1。を前提としていますが、HadoopOfficeライブラリは、Spark 1.xから直接使用することもできます。現在、このデータソースは、HadoopOfficeライブラリの次の形式をサポートしています。
Excelデータソース形式:
org.zuinnote.spark.office.Excel
古いExcel(.xls)および新しいExcel(.xlsx)のロードと保存このデータソースは、 Spark-packages.org および Maven Central 。
または、HadoopOfficeライブラリ( https://github.com/ZuInnoTe/hadoopoffice/wiki )を使用できます。これは、暗号化されたExcelドキュメントやリンクされたワークブックなどの機能もサポートします。もちろんSparkもサポートされています。
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");