如何在spark java中编写数据集对象excel?

时间:2017-06-24 07:23:32

标签: apache-spark pyspark apache-spark-sql spark-dataframe

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

INNER JOIN 
(
    SELECT other_model.id, /* more fields,*/ 1 as some_flag
    FROM other_model
) as sub on mymodel.other_model_id = sub.id

但我尝试使用相同的(com.crealytics.spark.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");

但我得到的错误。

  

java.lang.RuntimeException:com.crealytics.spark.excel.DefaultSource   不允许将create table作为select。

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

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

我在 pom.xml

中添加了以下依赖项
    SourcePropertSet.write()
             .format("org.zuinnote.spark.office.excel")
             .option("write.locale.bcp47", "de") 
             .save("D:\\result");

但我收到了以下错误。

  

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文件。

2 个答案:

答案 0 :(得分:1)

您选择的库com.crealytics.spark.excel看起来没有任何与编写 excel文件相关的代码。在其下方使用Apache POI来读取Excel文件,也很少examples

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

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

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

答案 1 :(得分:0)

您在编写时遇到的错误来自旧版本的HaodoopOffice库。请确保您只有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