У меня есть ведро S3, которое заполнено файлами Gz, которые не имеют расширения файла. Например, s3://mybucket/1234502827-34231
Spark - чтение сжатых файлов без расширения файла
sc.textFile
использует это расширение файла для выбора декодера. Я нашел много сообщений в блоге по обработке пользовательских расширений файлов, но ничего о недостающих расширениях файлов.
Я думаю, что решение может быть sc.binaryFiles
и разархивировать файл вручную.
Другая возможность - выяснить, как sc.textFile находит формат файла. Я не понимаю, как работают эти classOf[]
.
def textFile(
path: String,
minPartitions: Int = defaultMinPartitions): RDD[String] = withScope {
assertNotStopped()
hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
minPartitions).map(pair => pair._2.toString).setName(path)
}
'sc.textFile' не определяет формат. Это делается с помощью «TextInputFormat», и используется только расширение. –
Или переименуйте все файлы в s3, добавив '.gz'. Я взглянул на источник, и он реализован здесь: https://hadoop.apache.org/docs/stable/api/src-html/org/apache/hadoop/io/compress/CompressionCodecFactory#line.191 Это действительно используйте расширение файла. Спектр предполагает, что вы можете просто взглянуть на первые пару байтов http://www.zlib.org/rfc-gzip.html#file-format, но это говорит о том, что вы можете получить ложные срабатывания и должны учитывать endian https: // stackoverflow.com/questions/6059302/how-to-check-if-a-file-is-gzip-compressed, поэтому, без сомнения, просто использование '.gz' является более быстрым и надежным соглашением – Davos
@ user6022341' TextInputFormat' не делает это метод 'getCodec (Path file)' в этом классе 'org.apache.hadoop.io.compress.CompressionCodecFactory' – Davos