2

我正在使用com.crealytics.spark.excel包读取 excel 文件。下面是在 spark java 中读取 excel 文件的代码。

    Dataset<Row> SourcePropertSet = sqlContext.read()
               .format("com.crealytics.spark.excel")
               .option("location", "D:\\5Kto10K.xlsx")
               .option("useHeader", "true")
               .option("treatEmptyValuesAsNulls", "true")
               .option("inferSchema", "true")
               .option("addColorColumns", "false")
               .load("com.databricks.spark.csv");

但我尝试使用相同的 (com.crealytics.spark.excel)包将数据集对象写入 spark java 中的 excel 文件。

    SourcePropertSet.write()
          .format("com.crealytics.spark.excel")
          .option("useHeader", "true")
          .option("treatEmptyValuesAsNulls", "true")
          .option("inferSchema", "true")
          .option("addColorColumns", "false").save("D:\\resultset.xlsx");

但我得到了错误。

java.lang.RuntimeException:com.crealytics.spark.excel.DefaultSource 不允许创建表作为选择。

甚至我也尝试过使用org.zuinnote.spark.office.excel包。下面是代码。

    SourcePropertSet.write()
             .format("org.zuinnote.spark.office.excel")
             .option("write.locale.bcp47", "de") 
             .save("D:\\result");

我在pom.xml中添加了以下依赖项

<dependency>
              <groupId>com.github.zuinnote</groupId>
              <artifactId>hadoopoffice-fileformat</artifactId>
              <version>1.0.0</version>
          </dependency>
        <dependency>
            <groupId>com.github.zuinnote</groupId>
            <artifactId>spark-hadoopoffice-ds_2.11</artifactId>
            <version>1.0.3</version>
        </dependency> 

但我得到了错误。

java.lang.IllegalAccessError: 试图访问方法 org.zuinnote.hadoop.office.format.mapreduce.ExcelFileOutputFormat.getSuffix(Ljava/lang/String;)Ljava/lang/String; 来自 org.zuinnote.spark.office.excel.ExcelOutputWriterFactory 类

请帮助我将数据集对象写入 spark java 中的 excel 文件。

4

2 回答 2

1

看起来您选择的库com.crealytics.spark.excel没有任何与编写excel 文件相关的代码。在它下面使用Apache POI来读取 Excel 文件,也有几个例子

好消息是 CSV 是一个有效的 Excel 文件,您可以使用spark-csv来编写它。您需要像这样更改代码:

sourcePropertySet.write
    .format("com.databricks.spark.csv")
    .option("header", "true")
    .save("D:\\resultset.csv");

请记住,Spark 每个分区生成 1 个输出文件,您可能希望.repartition(1)只拥有一个结果文件。

于 2017-06-25T11:15:51.823 回答
0

您在编写时遇到的错误来自旧版本的 HadoopOffice 库。请确保您只有版本 1.0.3 或更好的 1.0.4 作为依赖项。你能提供你的构建文件吗?以下应该有效:

 SourcePropertSet.write()
             .format("org.zuinnote.spark.office.excel")
             .option("spark.write.useHeader",true)
             .option("write.locale.bcp47", "us") 
             .save("D:\\result");

HadoopOffice 的 Spark2 数据源 1.0.4 版还支持在读取时推断架构:

 Dataset<Row> SourcePropertSet = sqlContext.read()
               .format("org.zuinnote.spark.office.excel")
               .option("spark.read.useHeader", "true")
               .option("spark.read.simpleMode", "true")
               .load("D:\\5Kto10K.xlsx");

请注意,不建议在一个应用程序中混合基于 POI 的不同 Excel 数据源。

更多信息在这里:https ://github.com/ZuInnoTe/spark-hadoopoffice-ds

于 2017-07-31T22:56:15.963 回答