1 Вопрос: Как я могу оптимизировать вывод схемы на удаленный файл для CSV с Spark

вопрос создан в Wed, May 8, 2019 12:00 AM

У меня есть удаленный файл в S3 (или другой), и мне нужна схема файла. Я не нашел опцию для выборки данных, как для JSON (e.g. read.option("samplingRation", 0.25)).

Есть ли способ оптимизировать чтение схемы?

Spark считывает весь CSV-файл по сети перед возвратом выведенной схемы. Для больших файлов это может занять довольно много времени.

.option("samplingRatio", samplingRatioVal) не работает на CSV

    
1
1 ответ                              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
  }

например.

schemaSampleSize = 10000

delimiterOption = ','

    
1
2019-05-08 19: 44: 55Z
источник размещен Вот