как я могу читать файлы xls и xlsx в искре с помощью java?

Я хочу читать файлы xls и xlsx (MS Excel) построчно в искре, как мы делаем это для текстовых файлов ИЛИ как?

Я хочу использовать искру для повышения производительности при чтении большого файла xls, скажем, 1 ГБ, поэтому мне нужна искра для чтения файла по частям, как мы это делаем для текстовых файлов.

Как я могу читать данные из файлов Excel в искрах, независимо от того, построчно или нет?

Я просто хочу прочитать записи в файле xls, используя искру.

Пожалуйста, предложите.

Спасибо!!!


person Harish Pathak    schedule 29.07.2015    source источник


Ответы (4)


Вы не можете сделать это с spark . Он не предназначен для этого. Используйте другую библиотеку, например. Apache POI, чтобы прочитать Excel, а затем передать эти данные для искры в виде текста.

person Shahzeb    schedule 29.07.2015
comment
Спасибо за ваш ответ. Я хочу спросить, если мы не можем читать данные напрямую из Excel, и нам нужно читать их с помощью простой Java, чем может повыситься производительность, поскольку я сначала читаю с помощью Java, а затем обрабатываю его с помощью искры? мы должны сделать это для действительно больших файлов, как я уже упоминал? - person Harish Pathak; 29.07.2015
comment
Да, проблема в Excel, но, с другой стороны, вы только читаете его, используя внешнюю библиотеку, а не обрабатываете его. Чтение даже больших файлов не будет слишком дорогим по сравнению с обработкой. Думайте об этом как об источнике данных, если бы ваши данные находились в базе данных, вам пришлось бы сначала прочитать их, прежде чем обрабатывать. Вы также можете использовать многопоточность для чтения, если это необходимо, но даже для нескольких сотен гигабайтов вы все равно сможете одновременно читать и подавать. - person Shahzeb; 29.07.2015
comment
Привет. Сейчас 2017 год, и я нашел эту библиотеку. Это может помочь. Ваше здоровье! github.com/crealytics/spark-excel - person Jesús Zazueta; 26.05.2017

Хотя вопрос немного устарел, я все еще отвечаю на него. Может быть, это будет полезно для кого-то еще. Ответ: да, вы можете сделать это с помощью apache spark 2.x. Допустим, вы хотите преобразовать xls с 3 столбцами в набор данных.

  class Bean {
     private String col1;
     private String col2;   
     private Timestamp col3;
}

StructType structType= new StructType(new StructField[] {
                new StructField("col1", DataTypes.StringType, true, Metadata.empty()),
                new StructField("col2", DataTypes.StringType, true, Metadata.empty()),
                new StructField("col3", DataTypes.TimestampType, true, Metadata.empty())
        });

Dataset<Bean> ds = sparkSession.read().
                schema(structType).
                format("com.crealytics.spark.excel").
                option("useHeader", true). // If the xls file has headers
                option("timestampFormat", "yyyy-MM-dd HH:mm:ss"). // If you want to convert timestamp to a specific format
                option("treatEmptyValuesAsNulls", "false").
                option("inferSchema", "false").
                option("addColorColumns", "false").
                load("/home/user/test/sample.xls"). //path to xls or xlsx
                as(Encoders.bean(Bean.class)); // Bean in which you want to convert the data, you can remove this line if Dataset<Row> is just fine for you
person Adiant    schedule 18.05.2018

Вот как я сделал.

В maven добавить зависимости

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.crealytics</groupId>
        <artifactId>spark-excel_2.11</artifactId>
        <version>0.11.1</version>
    </dependency>
</dependencies>

Мой основной класс

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class ReadExcelSheets {

    public static void main(String[] args) {
        //skip logging extras
        Logger.getLogger("org").setLevel(Level.ERROR);

       //build session
        SparkSession spark = SparkSession
                .builder()
                .appName("Java Spark SQL Example")
                .config("spark.master", "local")
                .getOrCreate();

        //read excel - change file name
        Dataset<Row> df = spark.read()
                .format("com.crealytics.spark.excel")
                .option("useHeader", "true")
                //.option("dataAddress", "'Sheet1'!A1:M1470") // optional when you want to read sheets where A1 first top cell and M1470 us very bottom left of sheet.
                .load("datasets/test1.xlsx");
        //show your data
        df.show();
    }
}
person VK321    schedule 28.05.2019

Вы можете попробовать библиотеку HadoopOffice для чтения/записи файлов Excel с помощью Spark (https://github.com/ZuInnoTe/hadoopoffice/wiki). Он поддерживает зашифрованный Excel, связанные книги, фильтрацию по метаданным...

person Jörn Franke    schedule 17.06.2017