web-dev-qa-db-fra.com

Comment construire Dataframe à partir d'un fichier Excel (xls, xlsx) dans Scala Spark?

J'ai un gros fichier Excel(xlsx and xls) avec plusieurs feuilles et je dois le convertir en RDD ou Dataframe afin qu'il puisse être joint à d'autres dataframe plus tard. Je pensais utiliser POI Apache et l'enregistrer en tant que CSV puis lire csv dans dataframe. Mais s'il existe des bibliothèques ou des API qui peuvent aider dans ce processus, ce serait facile. Toute aide est grandement appréciée.

10
Shankar Koirala

La solution à votre problème consiste à utiliser Spark Excel dépendance dans votre projet.

Spark Excel a options flexible pour jouer avec.

J'ai testé le code suivant pour lire à partir de Excel et le convertir en dataframe et cela fonctionne parfaitement

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)

vous pouvez donner sheetname comme option si votre feuille Excel a plusieurs feuilles

.option("sheetName", "Sheet2")

J'espère que c'est utile

19
Ramesh Maharjan

Voici lire et écrire exemples à lire et à écrire dans Excel avec un ensemble complet d'options. ..

Source spark-Excel de crealytics

API Scala Spark 2.0 + :

Créez un DataFrame à partir d'un fichier 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")

Écrire un DataFrame dans un fichier 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")

Remarque: Au lieu de sheet1 ou sheet2, vous pouvez également utiliser leurs noms .. dans cet exemple ci-dessus Daily is nom de la feuille.

  • Si vous voulez l'utiliser depuis spark Shell ...

Ce package peut être ajouté à Spark en utilisant le --packages option de ligne de commande. Par exemple, pour l'inclure au démarrage du spark Shell:

$SPARK_HOME/bin/spark-Shell --packages com.crealytics:spark-Excel_2.11:0.9.8
  • Des dépendances doivent être ajoutées (en cas de maven etc ...):
groupId: com.crealytics
artifactId: spark-Excel_2.11
version: 0.9.8

Astuce: C'est une approche très utile, en particulier pour écrire des cas de test maven où vous pouvez placer des feuilles Excel avec des exemples de données Excel src/main/resources et vous pouvez y accéder dans vos cas de tests unitaires (scala/Java), ce qui crée DataFrame [s] à partir de la feuille Excel ...

A Spark source de données pour la bibliothèque HadoopOffice. Cette Spark source de données suppose au moins Spark 2.0.1. Cependant, HadoopOffice la bibliothèque peut également être utilisée directement depuis Spark 1.x. Actuellement, cette source de données prend en charge les formats suivants de la bibliothèque HadoopOffice:

Format de la source de données Excel: org.zuinnote.spark.office.Excel Chargement et sauvegarde de l'ancien Excel (.xls) et du nouveau Excel (.xlsx) Cette source de données est disponible sur Spark-packages.org et sur Maven Central .

6
Ram Ghadiyaram

Vous pouvez également utiliser la bibliothèque HadoopOffice ( https://github.com/ZuInnoTe/hadoopoffice/wiki ), qui prend également en charge les documents Excel cryptés et les classeurs liés, entre autres fonctionnalités. Bien sûr Spark est également pris en charge.

2
Jörn Franke

J'ai utilisé le pot de version com.crealytics.spark.Excel-0.11 et créé en spark-Java, ce serait la même chose dans scala aussi, il suffit de changer javaSparkContext en 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