我有一個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