在Spark中调用Scala UDF时,如何将BinaryType转换为Array[Byte]?
我用Scala编写了以下UDF:在Spark中调用Scala UDF时,如何将BinaryType转换为Array[Byte]?,scala,apache-spark,user-defined-functions,Scala,Apache Spark,User Defined Functions,我用Scala编写了以下UDF: import java.io.{ByteArrayOutputStream,ByteArrayInputStream} 导入java.util.zip.{gzip输入流} def解压缩(压缩:数组[字节]):字符串={ val inputStream=new gzip输入流(new ByteArrayInputStream(压缩)) val output=scala.io.Source.fromInputStream(inputStream).mkString
import java.io.{ByteArrayOutputStream,ByteArrayInputStream}
导入java.util.zip.{gzip输入流}
def解压缩(压缩:数组[字节]):字符串={
val inputStream=new gzip输入流(new ByteArrayInputStream(压缩))
val output=scala.io.Source.fromInputStream(inputStream).mkString
返回输出
}
val decompressUdf=(压缩:数组[字节])=>{
解压缩(压缩)
}
spark.udf.register(“解压缩”,decompressUdf)
然后,我尝试使用以下命令调用UDF:
val sessionsRawDF=
sessionRawDF
.withColumn(“WebsiteSession”,解压缩UDF(sessionRawDF(“body”))
.选择(
当前_timestamp().别名(“摄取时间”),
当前时间戳().cast(“日期”).alias(“p\U日期”),
col(“分区”),
列(“排队时间”),
col(“WebsiteSession”).alias(“Json”)
)
当我运行此操作时,会出现以下错误:
命令-130062350733681:9:错误:类型不匹配找到:org.apache.spark.sql.Column 必需:数组[字节] decompressUdf(col(“WebsiteSession”).alias(“Json”) 我的印象是Spark会隐式地获取值,并在本例中从Spark类型转到Array[Byte]
请帮助我了解发生了什么事情,我已经为此奋斗了一段时间,不知道还有什么可以尝试。您需要先将Scala函数转换为Spark UDF,然后才能将其注册为UDF。比如说,
val decompressUdf = udf(Decompress _)
spark.udf.register("Decompress", decompressUdf)
事实上,如果您只是在DataFrameAPI中使用UDF,则无需注册它。您只需运行第一行并使用decompressUdf
。只有在SQL中使用UDF时才需要注册