Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spark中调用Scala UDF时,如何将BinaryType转换为Array[Byte]?_Scala_Apache Spark_User Defined Functions - Fatal编程技术网

在Spark中调用Scala UDF时,如何将BinaryType转换为Array[Byte]?

在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

我用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
返回输出
}
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时才需要注册