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 № 1Use 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.