2017-03-12 1 views
0

Récemment je voulais faire Spark machine Learning Lab de Summit Spark 2016. Vidéo de formation est here et bloc-notes est disponible exportée here.Comment lire plusieurs fichiers Excel et les concaténer en un seul Apache Spark DataFrame?

L'ensemble de données utilisé dans le laboratoire peut être téléchargé à partir UCI Machine Learning Repository. Il contient un ensemble de lectures de divers capteurs dans une centrale électrique alimentée au gaz. Le format est un fichier xlsx avec cinq feuilles.

Pour utiliser les données dans le laboratoire, j'avais besoin de lire toutes les feuilles du fichier Excel et de les concaténer en un seul Spark DataFrame. Pendant la formation, ils utilisent Databricks Notebook mais j'utilisais IntelliJ IDEA avec Scala et j'évaluais le code dans la console.

La première étape consistait à enregistrer toutes les feuilles Excel dans des fichiers xlsx distincts nommés sheet1.xlxs, sheet2.xlsx, etc. et de les placer dans le répertoire sheets.

Comment lire tous les fichiers Excel et les concaténer en un seul Apache Spark DataFrame?

Répondre

1

Pour cela, j'ai utilisé le paquet spark-excel. Il peut être ajouté à build.sbt fichier comme: libraryDependencies += "com.crealytics" %% "spark-excel" % "0.8.2"

Le code à exécuter dans IntelliJ IDEA Scala Console était:

import org.apache.spark.{SparkConf, SparkContext} 
import org.apache.spark.sql.{SparkSession, DataFrame} 
import java.io.File 

val conf = new SparkConf().setAppName("Excel to DataFrame").setMaster("local[*]") 
val sc = new SparkContext(conf) 
sc.setLogLevel("WARN") 

val spark = SparkSession.builder().getOrCreate() 

// Function to read xlsx file using spark-excel. 
// This code format with "trailing dots" can be sent to IJ Scala Console as a block. 
def readExcel(file: String): DataFrame = spark.read. 
    format("com.crealytics.spark.excel"). 
    option("location", file). 
    option("useHeader", "true"). 
    option("treatEmptyValuesAsNulls", "true"). 
    option("inferSchema", "true"). 
    option("addColorColumns", "False"). 
    load() 

val dir = new File("./data/CCPP/sheets") 
val excelFiles = dir.listFiles.sorted.map(f => f.toString) // Array[String] 

val dfs = excelFiles.map(f => readExcel(f)) // Array[DataFrame] 
val ppdf = dfs.reduce(_.union(_)) // DataFrame 

ppdf.count() // res3: Long = 47840 
ppdf.show(5) 

Sortie de la console:

+-----+-----+-------+-----+------+ 
| AT| V|  AP| RH| PE| 
+-----+-----+-------+-----+------+ 
|14.96|41.76|1024.07|73.17|463.26| 
|25.18|62.96|1020.04|59.08|444.37| 
| 5.11| 39.4|1012.16|92.14|488.56| 
|20.86|57.32|1010.24|76.64|446.48| 
|10.82| 37.5|1009.23|96.62| 473.9| 
+-----+-----+-------+-----+------+ 
only showing top 5 rows 
0

Nous avons besoin de bibliothèque étincelles excel pour cela, peut être obtenu à partir

https://github.com/crealytics/spark-excel#scala-api

  1. clone du projet git de lien ci-dessus github et construire en utilisant "paquet SBT"
  2. Utiliser Spark 2 pour lancer l'étincelle coquille

étincelle shell --driver classe-chemin ./ étincelles excel_2.11-0.8.3.jar --master = fil client

  1. Importer le nécessaire

import org.apache.spark.sql._
import org.apache.spark.sql.functions._
val sqlContext = new SQLContext(sc)

  1. Set chemin doc excel

val document = "path to excel doc"

  1. Execute le ci-dessous fonction pour créer une trame de données
val dataDF = sqlContext.read 
          .format("com.crealytics.spark.excel") 
          .option("sheetName", "Sheet Name") 
          .option("useHeader", "true") 
          .option("treatEmptyValuesAsNulls", "false") 
          .option("inferSchema", "false") 
          .option("location", document) 
          .option("addColorColumns", "false") 
          .load(document) 

C'est tout! Vous pouvez maintenant exécuter l'opération Dataframe sur l'objet dataDF.