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.
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
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.
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
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éeDataFrame
[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 .
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.
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");