当前位置: 首页 > 知识库问答 >
问题:

Scala中的Spark SQL(V2.0)UDAF返回空字符串

齐泰
2023-03-14

当我试图为我们的一个复杂问题创建一个UDAF时,我决定从一个基本的UDAF开始,该UDAF按原样返回列。既然我是刚开始使用SQL/Scala的,有人能帮我指出我的错误吗。

代码如下:

导入org.apache.spark.sql.expressions.mutableaggregationbuffer导入org.apache.spark.sql.expressions.userdefinedaggregatefunction导入org.apache.spark.sql.row导入org.apache.spark.sql.types._导入org.apache.spark.sql.types.dataTypes

导入Scala.Collection._

重写def bufferSchema:StructType=StructType(StructField(“shingles”,(StringType))::Nil)

重写def DataType:DataType=(StringType)

重写def deterministic:Boolean=true

重写def merge(buffer1:MutableAggregationBuffer,buffer2:Row):Unit={}

重写def evaluate(buffer:Row):Any={buffer(0)}}

运行上述UDAF的代码如下:

import spark.implicits._;

val df = spark.read.json("people.json")
df.createOrReplaceTempView("people")
val sqlDF = spark.sql("Select name from people")
sqlDF.show()

val minhash = df.select(MinhashUdaf(col("name")).as("minhash"))
minhash.printSchema()
minhash.show(truncate = false)

由于在UDAF中我是按原样返回输入,所以我应该按原样获取每一行的列“name”的值。而在运行上面的字符串时,返回的是一个空字符串。

共有1个答案

董哲
2023-03-14

您没有实现合并函数。

使用下面的代码,可以根据需要打印列的值。

object MinhashUdaf extends UserDefinedAggregateFunction {

override def inputSchema: org.apache.spark.sql.types.StructType = StructType(StructField("value", StringType) :: Nil)

override def bufferSchema: StructType = StructType( StructField("shingles", (StringType)) :: Nil)

override def dataType: DataType = (StringType)

override def deterministic: Boolean = true

override def initialize(buffer: MutableAggregationBuffer): Unit = { buffer(0) = ("") }

override def update(buffer: MutableAggregationBuffer, input: Row): Unit = { buffer.update(0, input.get(0)) }

override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {  buffer1.update(0, buffer2.get(0))}

override def evaluate(buffer: Row): Any = { buffer(0) } }
 类似资料:
  • 我尝试使用graph api v2.0获取我的组,但数据返回为空: 在此之前,我使用v1.0,这是可行的。我使用:

  • 问题内容: 我犹豫要问这个问题,因为它看起来很奇怪。但不管怎么说。以防万一有人已经遇到了相同的问题…文件系统功能(fopem,file,file_get_contents)对于http://包装器表现得很奇怪 它似乎有效。 没有提出错误 。fopen()返回资源。 它不会为所有肯定有效的网址返回任何数据(例如)。 文件返回空数组,file_get_contents()返回空字符串,fread返回f

  • <code>Spark</code>版本为1.3.0。 来自< code > sqlcontext . Scala (https://github . com/Apache/spark/blob/master/SQL/core/src/main/Scala/org/Apache/spark/SQL/sqlcontext . Scala)的源代码: 我真的不能理解上面的代码。 是如何工作的? (_)

  • 我完全被Protobuf的问题困住了 给定以下代码: 这将计算为true并退出应用程序。什么可能使protobuf在MessageName上返回空字符串?我可以看到,这些类型及其名称在生成的protobuf消息代码中进行了应有的注册: 我还验证了上面的init实际运行,它确实运行。 我有其他生成的原始消息,它们会按预期返回它们的名称。那么这里出了什么问题? 编辑原型文件如下所示 再次编辑。手动调用

  • 我正在尝试分解一个字符串(从技术上讲,是从数据帧中的列传递的字符串),并将这些损坏的字符串作为列表返回到数据帧。斯卡拉版本 2.11。我更喜欢带有udf的斯卡拉或pyspark解决方案 - 因为udf内部发生了很多事情。 假设我有一个数据框架: 我想要的结果(在udf中,因为那里发生了很多事情;斯卡拉版本 2.11) -- 编写一个udf来打破这个并返回列表-但是,我不知道如何定义或传递模式以将结

  • 我遇到过一个奇怪的情况,在MSFT Azure短语断路器处理完一段文本后,有一段代码被设计用来剔除空白字符串、句点破折号等。我需要帮助找出如何调试这个问题。 当给定值时,以下代码块返回。显然,期望方法在第一个语句之后返回。在要看的899个短语中,似乎只有两个有这个问题。在另一台机器上也会发生。 下面是调试器的快照。 这可能是Visual Studio或.NET中的bug吗?我试着使用各种可视化器,