首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取多个Excel文件并将它们连接成一个Apache Spark DataFrame?

如何读取多个Excel文件并将它们连接成一个Apache Spark DataFrame?
EN

Stack Overflow用户
提问于 2017-03-12 22:38:39
回答 3查看 8.1K关注 0票数 3

最近,我想做Spark Summit 2016的Spark机器学习实验室。培训视频为here,导出的笔记本电脑可在here.上使用

实验中使用的数据集可以从UCI Machine Learning Repository下载。它包含了一组来自燃气发电厂各种传感器的读数。格式为五张纸的xlsx文件。

为了使用实验室中的数据,我需要从Excel文件中读取所有的表格,并将它们连接到一个Spark DataFrame中。在培训期间,他们使用的是Databricks Notebook,而我使用的是IntelliJ IDEA和Scala,并在控制台中评估代码。

第一步是将所有的Excel表格保存到单独的名为sheet1.xlxssheet2.xlsx等的xlsx文件中,并将它们放入sheets目录中。

如何读取所有的Excel文件并将它们连接到一个Apache Spark DataFrame中?

EN

回答 3

Stack Overflow用户

发布于 2017-03-12 22:38:39

为此,我使用了spark-excel包。它可以作为:libraryDependencies += "com.crealytics" %% "spark-excel" % "0.8.2"添加到build.sbt文件中

在IntelliJ IDEA Scala控制台中执行的代码是:

代码语言:javascript
复制
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)

控制台输出:

代码语言:javascript
复制
+-----+-----+-------+-----+------+
|   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 
票数 4
EN

Stack Overflow用户

发布于 2020-02-23 01:04:19

希望这段Spark Scala代码能有所帮助。

代码语言:javascript
复制
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{Path, FileSystem}
import org.apache.spark.deploy.SparkHadoopUtil
import org.apache.spark.sql.execution.datasources.InMemoryFileIndex
import java.net.URI

def listFiles(basep: String, globp: String): Seq[String] = {
  val conf = new Configuration(sc.hadoopConfiguration)
  val fs = FileSystem.get(new URI(basep), conf)

  def validated(path: String): Path = {
    if(path startsWith "/") new Path(path)
    else new Path("/" + path)
  }

  val fileCatalog = InMemoryFileIndex.bulkListLeafFiles(
    paths = SparkHadoopUtil.get.globPath(fs, Path.mergePaths(validated(basep), validated(globp))),
    hadoopConf = conf,
    filter = null,
    sparkSession = spark)

  fileCatalog.flatMap(_._2.map(_.path))
}

val root = "/mnt/{path to your file directory}"
val globp = "[^_]*"

val files = listFiles(root, globp)
val paths=files.toVector

循环向量以读取多个文件:

代码语言:javascript
复制
for (path <- paths) {
     print(path.toString)

     val df= spark.read.
                   format("com.crealytics.spark.excel").
                   option("useHeader", "true").
                   option("treatEmptyValuesAsNulls", "false").
                   option("inferSchema", "false"). 
                   option("addColorColumns", "false").
                   load(path.toString)
}
票数 0
EN

Stack Overflow用户

发布于 2017-12-09 03:58:06

我们需要spark-excel库来做这个,可以从

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

  1. 从上面的github链接克隆git项目,并使用"sbt package“
  2. 构建,使用Spark2运行spark-shell

spark-shell --驱动程序类路径。/spark-excel_2.11-0.8.3.jar--=yarn-client

  1. 导入必要的

导入org.apache.spark.sql._

导入org.apache.spark.sql.functions._

val sqlContext = new SQLContext(sc)

  1. 设置excel文档路径

val document = "path to excel doc"

  1. 执行以下函数以从中创建数据帧

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(文档)

就这样!现在,您可以对dataDF对象执行数据帧操作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42748704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档