【问题标题】:how can I read xls and xlsx file in spark with java?如何使用 java 在 spark 中读取 xls 和 xlsx 文件?
【发布时间】:2015-07-29 07:11:18
【问题描述】:

我想在 spark 中逐行读取 xls 和 xlsx (MS Excel) 文件,就像我们对文本文件所做的那样,或者任何方式?

我想使用 spark 来提高读取大型 xls 文件(例如 1 GB)的性能,这就是为什么我需要 spark 像我们对文本文件一样读取部分文件的原因。

如何从spark中的excel文件中读取数据,无论是否逐行?

我只想使用 spark 读取 xls 文件中的条目。

请提出建议。

谢谢!!!

【问题讨论】:

    标签: java hadoop apache-spark rdd spark-dataframe


    【解决方案1】:

    这是我的做法。

    在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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      spark 无法做到这一点。它不是为此而生的。使用其他库,例如Apache POI 读取 excel,然后将该数据作为文本提供给 spark。

      【讨论】:

      • 感谢您的回答..我想问一下,如果我们不能直接从 excel 读取数据,我们必须使用简单的 java 读取它而不是如何提高性能,因为我第一次使用 java 读取然后用火花处理它?正如我所提到的,我们必须为非常大的文件执行此操作?
      • 是的,问题是 Excel,但另一方面,您只是使用外部库而不是处理它来读取它。与处理相比,即使读取大文件也不会非常昂贵。如果您的数据位于数据库中,则将其视为数据源,您必须在处理之前先读取它。如果必须,您也可以使用多线程来阅读,但即使是几百场演出,您仍然应该能够同时阅读和喂食。
      • 嗨。现在是 2017 年,我找到了这个图书馆。它可能会有所帮助。干杯! github.com/crealytics/spark-excel
      【解决方案3】:

      虽然这个问题有点老了,但我仍然在回答它。可能对其他人有用。 答案是肯定的,你可以用 apache spark 2.x 做到这一点。假设您要将具有 3 列的 xls 转换为数据集。

        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
      

      【讨论】:

        【解决方案4】:

        您可以尝试使用 HadoopOffice 库来使用 Spark (https://github.com/ZuInnoTe/hadoopoffice/wiki) 读取/写入 Excel 文件。它支持加密 Excel、链接工作簿、按元数据过滤...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-29
          • 2018-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多