2016-03-02 29 views
3

我有100个存储在HDFS中的Excel(* .xlsx)文件。从上面使用将大量Excel文件读取到Apache Spark中

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

扔乱码数据

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

阅读中的*的.xlsx文件中的一个: 的100个*的.xlsx文件被分为10个目录,如下图所示!我收到

一个明显的建议是使用Gnumeric电子表格应用程序的命令行工具,叫做ssconvert

$ ssconvert dataPoint.xlsx dataPoint.csv 

,然后倾倒入HDFS,这样我就可以直接读取* .csv文件。 但这不是我想要解决的或者是要求。

解决方案Python(首选)和Java将不胜感激。我是一名新手,所以详细的演练会非常有帮助。

在此先感谢。

+1

我会加载每个文件与xlrd https://pypi.python.org/pypi/xlrd处理它,然后联合所有的数据。 –

+0

@TomRon当你说处理它时,你的意思是将表单数据提取到一个python列表中,然后将该列表加载到一个RDD中? –

+0

尝试使用熊猫描述(http://stackoverflow.com/questions/9884353/xls-to-csv-convertor)转换为csv,然后加载到火花RDD – szu

回答

0

如果您愿意自己构建自定义的XLSX转换为CSV转换器,那么Apache POI Event API将成为理想之选。该API适用于大内存占位符的电子表格。看看它是什么关于 here。 以下是一个示例XSLX processing with the XSSF Event code

+0

您可以请详细说明一个例子或扔更多光? –

+0

如果您已经通过了我提供的第二个链接,您将看到一个类SheetHandler,它实现了两个名为startElement和endElement的方法。这些方法接收不同工作表元素的通知,如单元格值,行尾等。您会注意到,单元格值正在被打印到方法endElement中的方法的标准输出中。同样,你可以有一个输出路径,并将这些值写入一个CSV文件,或者可以自定义这些方法,以便在出现属性或其值时做任何事情。 –

1

使用以下代码可以使用Hadoop FileSystem API直接从HDFS读取Spark中的Excel文件。但是你必须实现的Apache POI API来解析数据

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)={ 

    } 
} 

读取(在:InputStream的)方法是您实现的Apache POI API来分析数据。

0

你可以尝试HadoopOffice库: https://github.com/ZuInnoTe/hadoopoffice/wiki

工程星火,如果你能使用Spark2数据源API你也可以使用Python。如果您不能使用Spark2数据源API,那么您可以使用标准Spark API来使用HadoopOffice库提供的HadoopFile格式读取/写入文件。

0

您可以使用Spark Excel Library将xlsx文件直接转换为DataFrame。详细示例请参阅this answer

从版本0.8.4开始,该库不支持流并将所有源行加载到内存中进行转换。