spark.read.excel - 使用自定义架构时不读取所有 Excel 行

Posted

技术标签:

【中文标题】spark.read.excel - 使用自定义架构时不读取所有 Excel 行【英文标题】:spark.read.excel - Not reading all Excel rows when using custom schema 【发布时间】:2021-12-31 08:27:42 【问题描述】:

我正在尝试从“excel”文件中读取 Spark DataFrame。我使用了 crealytics 依赖项。

在没有任何预定义架构的情况下,所有行都可以正确读取,但仅作为字符串类型的列。

为了防止这种情况,我使用了我自己的架构(我提到某些列是整数类型),但在这种情况下,当读取文件时,大部分 行都会被删除

build.sbt 中使用的库依赖:

"com.crealytics" %% "spark-excel" % "0.11.1",

Scala version - 2.11.8 
Spark version - 2.3.2

val inputDF = sparkSession.read.excel(useHeader = true).load(inputLocation(0))

上面读取所有数据 - 大约 25000 行。

但是,

val inputWithSchemaDF: DataFrame = sparkSession.read
   .format("com.crealytics.spark.excel")
   .option("useHeader" , "false")
   .option("inferSchema", "false")
   .option("addColorColumns", "true")
   .option("treatEmptyValuesAsNulls" , "false")
   .option("keepUndefinedRows", "true")
   .option("maxRowsInMey", 2000)
   .schema(templateSchema)
   .load(inputLocation)

这给了我 450 行。 有没有办法防止这种情况?提前致谢! (已编辑)

【问题讨论】:

【参考方案1】:

到目前为止,我还没有找到解决此问题的方法,但我尝试通过手动类型转换以不同的方式解决它。为了使它在代码行数方面更好一些,我借助了 for 循环。我的解决方案如下:

第 1 步:创建我自己的“StructType”类型架构:

val requiredSchema = new StructType() 
.add("ID", IntegerType, true)
.add("Vendor", StringType, true)
.add("Brand", StringType, true) 
.add("Product Name", StringType, true)
.add("Net Quantity", StringType, true)

第 2 步:在读取数据帧后输入类型转换(不使用自定义架构)从 excel 文件(读取数据时不使用架构) :

def convertInputToDesiredSchema(inputDF: DataFrame, requiredSchema: StructType)(implicit sparkSession: SparkSession) : DataFrame = 
   
    var schemaDf: DataFrame = inputDF 
  
    for(i <- inputDF.columns.indices)   
         
        if(inputDF.schema(i).dataType.typeName != requiredSchema(i).dataType.typeName)     
                 
            schemaDf = schemaDf.withColumn(schemaDf.columns(i), col(schemaDf.columns(i)).cast(requiredSchema.apply(i).dataType))       
        
     

    schemaDf 

这可能不是一个有效的解决方案,但比输入太多代码行来对多列进行类型转换要好。

仍在寻找原始问题的解决方案

此解决方案是为了以防万一有人想尝试并立即需要快速修复。

【讨论】:

【参考方案2】:

我在使用 PySpark 和 com.crealytics 时遇到了同样的问题。 inferSchema = 'false' 将我的所有数据读取为 stringType。指定架构或 .option(enforceSchema ='true') 会删除我的所有数据。还没有解决方案。不确定这是否是已知错误。

【讨论】:

以上是关于spark.read.excel - 使用自定义架构时不读取所有 Excel 行的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 和 Chrome 下架流行扩展 Stylish

matlab/simulink可变阻尼座椅悬架振动自适应控制设计与分析

matlab/simulink可变阻尼座椅悬架振动自适应控制设计与分析

SpringBoot Security 整合thymeleaf模板自定义登录页面,按需提示错误信息

matlab/simulink自适应控制轮毂电机驱动的电动汽车主动悬架构型与控制

上下架