我正在从数据库中读取一个 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)