Как построить фрейм данных из файла Excel (xls,xlsx) в Scala Spark?

у меня большой Excel(xlsx and xls) файл с несколькими листами, и мне нужно преобразовать его в RDD или Dataframe, Так что он может быть присоединен к другой dataframe позже. Я думал об использовании Apache POI и сохраните его как CSV а потом читать csv на dataframe. Но если есть какие-либо библиотеки или API, которые могут помочь в этом процессе, будет легко. Любая помощь высоко ценится.

3 ответов


решение вашей проблемы заключается в использовании Spark Excel зависимостей в вашем проекте.

Искра Excel гибкий options чтобы играть.

я протестировал следующий код для чтения из excel и преобразовать его в dataframe и все работает отлично

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)

вы можете дать sheetname as option если ваш лист Excel имеет несколько листов

.option("sheetName", "Sheet2")

Я надеюсь, что его полезным


здесь читать и написать примеры для чтения и записи в Excel С полным набором опций...

источник spark-excel от crealytics

Скала API-интерфейс СПАРК 2.0+:

создайте фрейм данных из файла 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")

напишите фрейм данных в файл 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")

Примечание: вместо sheet1 или sheet2 вы также можете использовать их имена.. в этом примере, приведенном выше ежедневно - это имя листа.

  • если вы хотите использовать его из spark shell...

этот пакет может быть добавлен в Spark с помощью командная строка. Например, чтобы включить его при запуске оболочки spark:

$SPARK_HOME/bin/spark-shell --packages com.crealytics:spark-excel_2.11:0.9.8
  • необходимо добавить зависимости (в случае maven так далее...):
groupId: com.crealytics
artifactId: spark-excel_2.11
version: 0.9.8

Совет : это очень полезный подход, особенно для написания тестовые примеры maven, в которых можно разместить листы excel с образцами данных в excel src/main/resources папка, и вы можете получить к ним доступ в ваших тестовых случаях(scala/java), который создает DataFrame[s] из листа excel...

  • другой вариант, который вы могли бы рассмотреть spark-hadoopoffice-ds

источник данных Spark для библиотеки HadoopOffice. Этот источник данных Spark предполагает хотя бы искру 2.0.1. Однако библиотека HadoopOffice может также используйте сразу от искры 1.х. В настоящее время этот источник данных поддерживает следующие форматы библиотеки HadoopOffice:

формат источника данных Excel:org.zuinnote.spark.office.Excel загрузка и Сохранение старого Excel (.xls) и новый Excel (.xlsx) этот источник данных доступно на Spark-packages.org и далее Maven Central.


кроме того, вы можете использовать библиотеку HadoopOffice (https://github.com/ZuInnoTe/hadoopoffice/wiki), который поддерживает также зашифрованные документы Excel и связанные книги, среди других функций. Конечно, Spark также поддерживается.