如何将 apache poi 工作簿转换为 Spark 数据帧?



我正在从数据库中读取一个 excel 文件的 blob。每个文件中仅包含一个工作表。使用 Apache poi,我正在将其转换为如下所示的工作簿。

val wb = w.getWorkbook(blob)

现在我想将其转换为 Spark 数据帧来处理它。直接执行此操作而不将其保存到磁盘的最佳方法是什么?

我想用斯卡拉转换它,就像,

val df: DataFrame = workbookToDf(org.apache.poi.ss.usermodel.Workbook)

只需创建迭代器,

Iterator<Row> rowIterator = w.getWorkbook(blob).getSheetAt(1).iterator;

遍历工作表并将单元格值放入 2D 数组中,

Object[][] tab = new Object[rows][cols];

.iterator(( 迭代行,在此循环中,您还必须创建单元格迭代器来迭代"列"。

Object[][] tab = new Object[rows][cols];
Iterator<Row> rowIterator = w.getWorkbook(blob).getSheetAt(1).iterator;
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
// For each row, iterate through all the columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
// Check the cell type and format accordingly
cell.setCellType(CellType.STRING);
tab[cell.getRowIndex()][cell.getColumnIndex()] = cell.getStringCellValue();
}
}

然后将您的 2D 数组转换为 Seq/List/Array of Strings,其中 String 将是行的串联元素。在下一步中使用sc.parallelize创建RDD,在map步骤中拆分字符串并创建RDD[Row]。我会看起来像这样:

val yourRDD = rdd.map(RowFactory.create(_.split(yourDelimiter)))

然后使用spark.createDataFrame(yourRDD,schema)

最新更新