我有 100 个 Excel (*.xlsx) 文件存储在 HDFS 中。
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 (preferable) 和 Java 中的解决方案将不胜感激。我是新手,所以详细的演练会非常有帮助。

提前致谢。

最佳答案

使用以下代码使用 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)={

  }
}

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

关于java - 将大量 Excel 文件读入 Apache Spark,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35743190/

10-11 22:38
查看更多