1 Câu hỏi: làm cách nào để tối ưu hóa suy luận lược đồ trên một tệp từ xa cho CSV bằng Spark

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi có một tệp từ xa trong S3 (hoặc loại khác) và tôi cần lược đồ của tệp. Tôi không tìm thấy tùy chọn để lấy mẫu dữ liệu như đối với JSON (e.g. read.option("samplingRation", 0.25)).

Có cách nào để tối ưu hóa việc đọc lược đồ không?

Spark đọc toàn bộ tệp CSV qua mạng trước khi trả về lược đồ được suy luận. Đối với các tệp lớn, việc này có thể mất nhiều thời gian.

.option("samplingRatio", samplingRatioVal) không hoạt động trên csv

    
1
1 Câu trả lời                              1                         
/**
    * infer schema for a remote csv file by reading a sample of the file and infering on that.
    * the spark-infer-schema behavior by default reads the entire dataset once!
    * for large remote files this is not desired. (e.g. inferring schema on a 3GB file across oceans takes a while)
    * speedup is achieved by only reading the first `schemaSampleSize` rows
    *
    * @param fileLocation
    * @param schemaSampleSize rows to be taken into consideration for infering the Schema
    * @param headerOption
    * @param delimiterOption
    * @return
    */
  def inferSchemaFromSample(sparkSession: SparkSession, fileLocation: String, schemaSampleSize: Int, headerOption: Boolean, delimiterOption: String): StructType = {
    val dataFrameReader: DataFrameReader = sparkSession.read
    val dataSample: Array[String] = dataFrameReader.textFile(fileLocation).head(schemaSampleSize)
    val firstLine = dataSample.head

    import sparkSession.implicits._
    val ds: Dataset[String] = sparkSession.createDataset(dataSample)

    val extraOptions = new scala.collection.mutable.HashMap[String, String]
    extraOptions += ("inferSchema" -> "true")
    extraOptions += ("header" -> headerOption.toString)
    extraOptions += ("delimiter" -> delimiterOption)

    val csvOptions: CSVOptions = new CSVOptions(extraOptions.toMap, sparkSession.sessionState.conf.sessionLocalTimeZone)
    val schema: StructType = TextInputCSVDataSource.inferFromDataset(sparkSession, ds, Some(firstLine), csvOptions)

    schema
  }

vd.

lược đồSampleSize = 10000

delimiterOption = ','

    
1
2019-05-08 19: 44: 55Z
nguồn đặt đây