【问题标题】:Reading large number of Excel files into Apache Spark将大量 Excel 文件读入 Apache Spark
【发布时间】:2016-06-15 01:37:57
【问题描述】:

我有 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(首选)和Java 中的解决方案将不胜感激。我是菜鸟,所以详细的演练会很有帮助。

提前致谢。

【问题讨论】:

标签: java python-3.x hadoop apache-spark pyspark


【解决方案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)={

  }
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您愿意为自己构建一个自定义 XLSX 到 CSV 转换器,Apache POI 事件 API 将是理想的选择。此 API 适用于内存占用较大的电子表格。看看 here 是什么。 这是一个例子XSLX processing with the XSSF Event code

      【讨论】:

      • 您能举个例子详细说明一下吗?
      • 如果您浏览了我提供的第二个链接,您将看到一个SheetHandler 类,它实现了两个名为startElement 和endElement 的方法。这些方法接收不同工作表元素的通知,如单元格值、行尾等。您会注意到,单元格值正在方法 endElement 中的方法中打印到标准输出。同样,您可以有一个输出路径并将这些值写入 CSV 文件,或者也可以自定义这些方法以在出现属性或其值时执行任何操作。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2017-02-17
        • 2019-02-08
        • 1970-01-01
        • 2011-03-16
        相关资源
        最近更新 更多