Spark приложение, которое сохраняет файл как .txt.gz в SFTP - PullRequest
0 голосов
/ 23 января 2020

У меня есть приложение Spark (Scala), которое сохраняет указанный c фрейм данных в SFTP как .txt файл. Файл, который приложение генерировало несколько раз, достигал 20 ГБ; что-то, что не может быть загружено потребителями. Я думаю, что могу сжать файл так, чтобы мы уменьшили его размер (особенно это текстовый файл, для которого мы ожидаем хорошую степень сжатия).

Есть ли какая-либо ссылка или библиотека, которые мне нужны работать с (импорт) в Spark, что может дать мне сжатый файл?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Поэтому я использовал разные подходы, пытаясь сохранить файл .txt.gz в SFTP. Гугл я нашел этот , который является Java кодом, который сжимает текстовый файл в .gz, я просто переписал этот код в Scala и все прошло отлично.

def zipFile(fileName1: String): Int = {
val gzpFile: String =  fileNameDotTxt + ".gz"

val SOURCE_FILE: String = pathToFileNameDotTxt 
val buffer: Array[Byte] = Array.ofDim[Byte](1024)
try {
  val gzos: GZIPOutputStream = new GZIPOutputStream(new FileOutputStream(gzpFile))
  val in: FileInputStream = new FileInputStream(SOURCE_FILE)
  var len: Int = 0
  while ({ len = in.read(buffer); len } > 0) gzos.write(buffer, 0, len)
  in.close()
  gzos.finish()
  gzos.close()


} catch {
  case ex: IOException =>
    ex.printStackTrace()

}

}

Нам нужно импортировать

import java.io.FileInputStream
import java.io.FileOutputStream
import java.util.zip.GZIPOutputStream

Надеюсь, эта воля поможет некоторым другим.

0 голосов
/ 24 января 2020

Вы можете сжать файл, используя option("codec","org.apache.hadoop.io.compress.snappyCodec"). Есть много доступных кодеков, которые предлагают различный уровень сжатия, например org.apache.hadoop.io.compress.GzipCodec.

Это не будет иметь никакого эффекта, если файл сохранен в формате .txt, но работает потрясающе, если вы используете формат csv, parquet или Avro. И паркет, и формат Avro можно разделить в сжатом состоянии, поэтому перед обработкой не нужно распаковывать вручную, спарк автоматически распакует.

Код для чтения текста и сохранения в виде паркета -

val df = spark.read.text("path to text file")

df.write.option("codec","org.apache.hadoop.io.compress.snappyCodec").parquet("destination path")

//read the file back
spark.read.parquet("path to compressed file").show()

Код читать CSV и сохранить как csv.gz.

val df = spark.read.csv("path to test.csv")
df.write.option("codec","org.apache.hadoop.io.compress.GzipCodec").csv("path to test2.gzip")
...