com.crealytics.spark.excel

    <dependency>
        <groupId>com.crealytics</groupId>
        <artifactId>spark-excel_2.12</artifactId>
        <version>3.2.1_0.17.1</version>
    </dependency>
// 较新的版本使用了poi5,easyexcel为4.1.2 使用 dependencyManagement 指定poi版本
// https://github.com/crealytics/spark-excel/blob/main/CHANGELOG.md
// CHANGELOG 标明了0.12.1 升级到poi4.1
    spark.read().format("com.crealytics.spark.excel")
        // 使用表头
        .option("header", "true")
        .option("treatEmptyValuesAsNulls", "true")
        // 自动推断schema
        .option("inferSchema", "true")
        //.option("addColorColumns", "true")
        // 时间格式
        .option("timestampFormat", "yyyy/MM/dd HH:mm:ss")
        .load(url);

7.27.2022 add

<!-- pom 文件中使用dependencyManagement 指定poi版本为spark-excel 所依赖的版本 -->
    <dependencyManagement>
        <!-- poi -->
        <dependencies>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>5.2.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>5.2.2</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

image.png
1658904929042.jpg
从3.0.5 升级到3.1.1 结构发生了变化,手动引入 poi 依赖

org.zuinnote.spark.office.excel

    <dependency>
        <groupId>com.github.zuinnote</groupId>
        <artifactId>spark-hadoopoffice-ds_2.12</artifactId>
        <version>1.6.4</version>
    </dependency>
// pom中的spark版本为2.4.8 解析时间的方法在实际使用的3.2.1被移除 使用时会报nosuchmethod
    spark.read().format("org.zuinnote.spark.office.excel")
        .option("read.spark.simpleMode",true)
        .option("hadoopoffice.read.header.read", true)
        .load(url);

poi 读取

    List<Map<String, String>> list = new ArrayList<>;
    // 假定数据为 [{"age":"1","sex":"0"}]
    // List<Map<String, String>> 转 List<Row>
    List<Row> rows = list.stream().map(map -> RowFactory.create(map.values().toArray())).collect(Collectors.toList());
    // createSchema (以第一条数据的key作为字段名) 
    StructType schema = DataTypes.createStructType(
               Arrays.stream(list.get(0).values().stream().map(String::toString).toArray(String[]::new)).map(fieldName -> new StructField(fieldName, DataTypes.StringType, true, Metadata.empty())).collect(Collectors.toList())
    );
    // easyExcel读取时 获取ReadListener的表头
    // 根据 headMap 创建 schema
    StructType schema = DataTypes.createStructType(
                headMap.values().stream().map(fieldName -> new StructField(fieldName, DataTypes.StringType, true, Metadata.empty()))
    .collect(Collectors.toList()));
    // List<Row> 转为 Dataset<Row>
    spark.createDataFrame(rows, schema);

宇宙第一帅
33 声望1 粉丝