spark读取csv文件,中文乱码,同一单元格同时出现引号逗号(",)串列问题,动态构建原有csv首行schema信息

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kaaosidao/article/details/84099509
 /**
      *
      * @param spark
      * @param headerSchema  是否用csv第一行作为schema信息
      * @param code  csv编码格式
      * @param file  csv绝对路径
      * @return
      */
    def readCSV(spark:SparkSession,headerSchema:String,code:String,file:String) ={
        val rddArr:RDD[Array[String]] = spark.sparkContext.hadoopFile(file, classOf[TextInputFormat],
            classOf[LongWritable], classOf[Text]).map(
            pair => new String(pair._2.getBytes, 0, pair._2.getLength, code))
            //处理同一个单元格 同时出现 引号 逗号串列问题 切割
            .map(_.trim.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)",-1))
        val fieldArr = rddArr.first()
        //Row.fromSeq(_) 如果只是 map(Row(_)),会导致 spark.createDataFrame(rddRow,schema)错误
        val rddRow = rddArr.filter(!_.reduce(_+_).equals(fieldArr.reduce(_+_))).map(Row.fromSeq(_))
        val schemaList = ArrayBuffer[StructField]()
        if("TRUE".equals(headerSchema)){
            for(i <- 0 until fieldArr.length){
                schemaList.append(StructField(fieldArr(i),DataTypes.StringType))
            }
        }else{
            for(i <- 0 until fieldArr.length){
                schemaList.append(StructField(s"_c$i",DataTypes.StringType))
            }
        }
        val schema = StructType(schemaList)
        spark.createDataFrame(rddRow,schema)
    }

猜你喜欢

转载自blog.csdn.net/kaaosidao/article/details/84099509