将大量的Excel文件读入Apache Spark

3

我在HDFS中有100个Excel(*.xlsx)文件。这100个*.xlsx文件分成10个目录,如下所示:

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

使用以下方式之一,从上面的*.xlsx文件中读取:

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

抛出了无意义的数据!

我收到了一个明显的建议,就是使用Gnumeric电子表格应用程序的命令行实用程序ssconvert

$ ssconvert dataPoint.xlsx dataPoint.csv

然后将其转储到HDFS中,这样我就可以直接读取*.csv文件。但这不是我要解决的问题或需求。
最好使用Python和Java的解决方案(优先考虑Python)。我是新手,所以详细的步骤说明会非常有帮助。
提前感谢。

1
我会使用xlrd https://pypi.python.org/pypi/xlrd加载每个文件,处理它,然后合并所有数据。 - Tom Ron
@TomRon,当你说“process it”时,是指将表格数据提取到Python列表中,然后将该列表加载到RDD中吗? - benSooraj
尝试按照以下描述(https://dev59.com/y2kw5IYBdhLWcg3wdKMv)使用pandas将文件转换成CSV格式,然后加载到Spark RDD中。 - szu
4个回答

2
使用以下代码可以直接从HDFS中使用Hadoop FileSystem API在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)={

  }
}

read(in:InputStream) 方法是您实现 Apache POI API 解析数据的地方。


1
你可以使用Spark Excel Library直接将xlsx文件转换为DataFrames。查看this answer,其中包含详细示例。
截至版本0.8.4,该库不支持流式处理,并且会将所有源行加载到内存中进行转换。

0

如果您想要构建自定义的XLSX到CSV转换器,那么Apache POI事件API是非常理想的选择。该API适用于具有大内存占用的电子表格。请查看这里here了解更多信息。 以下是一个示例XSSF事件代码处理XSLX文件


你能否举个例子或者再详细解释一下? - benSooraj
如果你已经查看了我提供的第二个链接,你会看到一个名为SheetHandler的类,该类实现了两个方法:startElement和endElement。这些方法接收不同sheet元素的通知,比如单元格值、一行的结尾等等。你会注意到,在endElement方法中,单元格的值被打印到标准输出中。类似地,你可以有一个输出路径,将这些值写入CSV文件,或者根据属性或其值的发生情况自定义这些方法,做任何你想做的事情。 - Manish Mishra

0
你可以尝试使用HadoopOffice库: https://github.com/ZuInnoTe/hadoopoffice/wiki 该库可与Spark一起使用,如果您可以使用Spark2数据源API,则还可以使用Python。如果您无法使用Spark2数据源API,则可以使用由HadoopOffice库提供的HadoopFile格式使用标准Spark API读取/写入文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接