web-dev-qa-db-ja.com

Scala SparkでExcel(xls、xlsx)ファイルからDataframeを構築する方法は?

複数のシートを含む大きなExcel(xlsx and xls)ファイルがあり、後で他のRDDと結合できるように、Dataframeまたはdataframeに変換する必要があります。 Apache POI を使用してCSVとして保存し、csvdataframeを読み取ることを考えていました。ただし、このプロセスに役立つライブラリまたはAPIがあれば簡単です。どんな助けも大歓迎です。

10
Shankar Koirala

問題の解決策は、プロジェクトで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")

お役に立てば幸いです

19
Ramesh Maharjan

以下は、readwriteExcelの読み取りと書き込みの例の完全なセットですoptions。..

ソース crealyticsのSpark-Excel

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はシート名です。

  • spark Shell ...から使用する場合.

このパッケージは、--packagesコマンドラインオプションを使用してSparkに追加できます。たとえば、spark Shell

$SPARK_HOME/bin/spark-Shell --packages com.crealytics:spark-Excel_2.11:0.9.8
  • 依存関係を追加する必要があります(Mavenなどの場合):
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

6
Ram Ghadiyaram

または、HadoopOfficeライブラリ( https://github.com/ZuInnoTe/hadoopoffice/wiki )を使用できます。これは、暗号化されたExcelドキュメントやリンクされたワークブックなどの機能もサポートします。もちろんSparkもサポートされています。

2
Jörn Franke

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");
0
svk 041994