2016-03-02 64 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開始,該庫不支持流並將所有源行加載到內存中進行轉換。