Как прочитать несколько файлов Excel и объединить их в один фрейм данных Apache Spark?

Недавно я хотел провести лабораторию машинного обучения Spark на Spark Summit 2016. Обучающее видео можно найти здесь экспортированная записная книжка доступна здесь.

Набор данных, используемый в лабораторной работе, можно загрузить из репозитория машинного обучения UCI.. Он содержит набор показаний различных датчиков газовой электростанции. Формат - файл xlsx с пятью листами.

Чтобы использовать данные в лаборатории, мне нужно было прочитать все листы из файла Excel и объединить их в один фрейм данных Spark. Во время обучения они используют Databricks Notebook, но я использовал IntelliJ IDEA со Scala и оценивал код в консоли.

Первым шагом было сохранить все листы Excel в отдельные файлы xlsx с именами sheet1.xlxs, sheet2.xlsx и т. Д. И поместить их в каталог sheets.

Как прочитать все файлы Excel и объединить их в один фрейм данных Apache Spark?


person tomaskazemekas    schedule 12.03.2017    source источник


Ответы (3)


Для этого я использовал пакет 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 
person tomaskazemekas    schedule 12.03.2017
comment
Не обязательно, если он обрабатывает все вкладки в Excel или нет. Является ли? - person thebluephantom; 11.08.2018
comment
Я попробую, но это сэкономит время, зная это заранее - person thebluephantom; 11.08.2018

Надеюсь, этот код Spark Scala может помочь.

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

Зациклите вектор, чтобы прочитать несколько файлов:

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)
}
person Sakthivel Nachimuthu    schedule 22.02.2020

Для этого нам понадобится библиотека spark-excel, которую можно получить из

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

  1. клонируйте проект git из указанной выше ссылки на github и создайте с помощью "пакета sbt"
  2. Использование Spark 2 для запуска Spark-Shell

искровая оболочка --driver-class-path ./spark-excel_2.11-0.8.3.jar --master = пряжа-клиент

  1. Импортируйте необходимые

import org.apache.spark.sql._
import 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(document)

Это все! теперь вы можете выполнить операцию Dataframe с объектом dataDF.

person vijayraj34    schedule 08.12.2017