【问题标题】:spark.read.excel - Not reading all Excel rows when using custom schemaspark.read.excel - 使用自定义架构时不读取所有 Excel 行
【发布时间】: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 行。 有没有办法防止这种情况?提前致谢! (已编辑)

【问题讨论】:

    标签: excel scala apache-spark apache-spark-sql schema


    【解决方案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') 会删除我的所有数据。还没有解决方案。不确定这是否是已知错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 2019-05-10
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多