如何读取多个Excel文件并将它们连接成一个Apache Spark DataFrame?
最近我想从Spark Summit 2016开展Spark机器学习实验。培训video在这里 ,出口笔记本在这里。
实验室中使用的数据集可以从UCI Machine Learning Repository下载。 它包含来自燃气发电厂各种传感器的读数。 格式是带有五个工作表的xlsx文件。
要使用实验室中的数据,我需要读取Excel文件中的所有表单,并将它们连接成一个Spark DataFrame。 在培训期间,他们正在使用Databricks Notebook,但是我正在使用IntelliJ IDEA与Scala并在控制台中评估代码。
第一步是将所有的Excel工作表保存到名为sheet1.xlxs
, sheet2.xlsx
等单独的xlsx文件中,并将其放入工作sheets
目录中。
如何读取所有Excel文件并将它们连接成一个Apache Spark DataFrame?
为此,我使用了spark-excel软件包。 它可以被添加到build.sbt文件为: libraryDependencies += "com.crealytics" %% "spark-excel" % "0.8.2"
在IntelliJ IDEA Scala Console中执行的代码是:
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)
控制台输出:
+-----+-----+-------+-----+------+ | 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
我们需要这个spark-excel库,可以从中获得
https://github.com/crealytics/spark-excel#scala-api
- 从上面的github链接克隆git项目,并使用“sbt包”
- 使用Spark 2运行spark-shell
spark-shell –driver-class-path ./spark-excel_2.11-0.8.3.jar –master = yarn-client
- 导入必要的
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
val sqlContext = new SQLContext(sc)
- 设置Excel文档path
val document = "path to excel doc"
- 执行下面的函数来创build数据框
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)
就这样! 现在您可以对dataDF对象执行Dataframe操作。