/ / Lendo um grande número de arquivos do Excel no Apache Spark - java, python-3.x, hadoop, apache-spark, pyspark

Lendo um grande número de arquivos do Excel no Apache Spark - java, python-3.x, hadoop, apache-spark, pyspark

Eu tenho 100 arquivos do Excel (* .xlsx) armazenados no HDFS. Os arquivos 100 * .xlsx são organizados em 10 diretórios, como mostrado abaixo:

/user/cloudera/raw_data/dataPoint1/dataPoint.xlsx
/user/cloudera/raw_data/dataPoint2/dataPoint.xlsx
...
..
.
/user/cloudera/raw_data/dataPoint10/dataPoint.xlsx

Lendo em um dos arquivos * .xlsx acima, usando

rawData = sc.textFile("/user/cloudera/raw_data/dataPoint1/dataPoint.xlsx")

jogou dados sem sentido!

Uma sugestão óbvia que recebi foi usar o Gnumeric utilitário de linha de comando do aplicativo de planilha chamado ssconvert:

$ ssconvert dataPoint.xlsx dataPoint.csv

e depois despejá-lo no HDFS, para que eu possa ler o arquivo * .csv diretamente. Mas não é isso que estou tentando resolver ou é o requisito.

Soluções em Python (preferível) e Java seria apreciado. Eu sou um novato, então uma explicação detalhada seria realmente útil.

Desde já, obrigado.

Respostas:

1 para resposta № 1

Use o código a seguir para ler arquivos do Excel no Spark diretamente do HDFS usando a API do Hadoop FileSystem. No entanto, você precisa implementar a API do Apache POI para analisar os dados

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import java.util.Date
import scala.io.Source
import java.io.{ InputStream, FileInputStream, File }
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.{ Cell, Row, Workbook, Sheet }
import org.apache.poi.xssf.usermodel._
import scala.collection.JavaConversions._
import org.apache.poi.ss.usermodel.WorkbookFactory
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.Path;
import java.net._

object Excel {
def main(arr: Array[String]) {
val conf = new SparkConf().setAppName("Excel-read-write").setMaster("local[2]")
val sc = new SparkContext(conf)
val fs = FileSystem.get(URI.create("hdfs://localhost:9000/user/files/timetable.xlsx"),new Configuration());
val path=  new Path("hdfs://localhost:9000/user/files/timetable.xlsx");
val InputStream = fs.open(path)
read(InputStream)
}
def read(in:InputStream)={

}
}

O método read (in: InputStream) é onde você implementa a API do Apache POI para analisar os dados.


0 para resposta № 2

Se você estiver disposto a construir um costumeConversor XLSX para CSV, a API de eventos do Apache POI seria ideal para isso. Essa API é adequada para planilhas com grandes áreas de memória. Veja o que é isso Aqui. Aqui está um exemplo Processamento XSLX com o código de Evento XSSF


0 para resposta № 3

Você pode tentar a biblioteca HadoopOffice: https://github.com/ZuInnoTe/hadoopoffice/wiki

Funciona com o Spark e se você pode usar o Spark2API de fonte de dados, você também pode usar o Python. Se você não puder usar a API de fonte de dados Spark2, poderá usar as APIs padrão do Spark para ler / gravar arquivos usando um Formato HadoopFile fornecido pela biblioteca HadoopOffice.


0 para a resposta № 4

Você pode usar Biblioteca Spark Excel para converter arquivos xlsx diretamente em DataFrames. Vejo esta resposta com um exemplo detalhado.

A partir da versão 0.8.4, a biblioteca não suporta streaming e carrega todas as linhas de origem na memória para conversão.