Вы можете определить искровой UDF (пользовательскую функцию), который распаковывает байтовый массив gzip:
- определяет UDF, который получает байтовый массив и возвращает строку
static UDF1 unzip = (UDF1<byte[], String>) YourClass::gzipDecompress;
зарегистрировать этот UDF
spark.sqlContext().udf().register("unzip", unzip, DataTypes.StringType);
попросите спарк вычислить столбец с использованием UDF
df.withColumn("unzipped_column", callUDF("unzip", col("your_original_column_with_gzip_data")))
Вы можете получить выгоду, взглянув на другую аналогичную реализацию декомпрессии gzip в scala, игнорируя сбои:
def decompress(compressed: Array[Byte]): String = {
val inputStream = new GZIPInputStream(new ByteArrayInputStream(compressed))
scala.io.Source.fromInputStream(inputStream).mkString
}
источник: https://github.com/rest-assured/rest-assured/blob/master/examples/scalatra-example/src/main/scala/io/restassured/scalatra/support/Gzip.scala
Примечание: пример UDF написан на java, но должен быть очень похожим на scala, см. https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/functions.html#callUDF-java.lang.String-org.apache.spark.sql.Column...-