Как преобразовать книгу apache poi в фрейм данных spark? - PullRequest
1 голос
/ 20 сентября 2019

Я читаю блоб файла excel из базы данных.Каждый файл содержит только один лист.Используя Apache poi, я преобразую его в рабочую книгу, как показано ниже.

val wb = w.getWorkbook(blob)

Теперь я хочу преобразовать его в искровой фрейм данных для его обработки.Каков наилучший способ сделать это напрямую, не сохраняя его на диск?

Я хочу преобразовать его в scala, например,

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

1 Ответ

1 голос
/ 20 сентября 2019

Просто создайте итератор,

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 будет объединять элементы строк.На следующем шаге создайте RDD с помощью sc.parallelize, на шаге карты разделите вашу строку и создайте RDD[Row].Я буду выглядеть так:

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

, а затем использовать spark.createDataFrame(yourRDD,schema)

...