Spark报错:No applicable constructor/method found for ... 常见类型和解决方法

在使用SparkSQL的自定义聚合函数时,遇到"No applicable constructor/method found"错误。常见原因包括类型不匹配(如Integer转long)和访问权限问题。解决方法包括调整类型为long并确保公共访问权限。对于类的组织结构,可将类移到独立文件或作为内部类。深入理解Spark动态生成代码逻辑有助于进一步排查类似问题。

在学习SparkSQL的自定义聚合函数时,遇到了各种No applicable constructor/method found for的错误。

【错误一】No applicable constructor/method found for actual parameters "long"; candidates are: "public void common.Employee.setAge(int)"

错误代码如下

package common;

import java.io.Serializable;

public class Employee implements Serializable {
    private String name;
    private int age; // int类型会报错
    private int depId;
    private String gender;
    private long salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getDepId() {
        return depId;
    }

    public void setDepId(int depId) {
        this.d
`groovy.lang.MissingMethodException: No signature of method: java.lang.String.call() is applicable for argument types: (java.lang.String) values: [https://maven.aliyun.com/repository/google]` 错误表明在 Groovy 代码里尝试调用 `java.lang.String` 类中不存在的 `call` 方法,且传递了一个 `java.lang.String` 类型的参数。以下是可能的解决办法: ### 检查代码中调用的位置 要保证在代码里没有错误地对字符串调用 `call` 方法。比如: ```groovy def str = "https://maven.aliyun.com/repository/google" // 错误调用 // str.call("https://maven.aliyun.com/repository/google") // 正确使用字符串的方式 println(str) ``` ### 确认变量类型 要确保变量的类型符合预期,防止意外将字符串当作可调用对象。例如,要是代码里有闭包字符串混淆的情况: ```groovy // 正确使用闭包 def closure = { param -> println("Called with: $param") } closure("https://maven.aliyun.com/repository/google") // 字符串不能这样调用 def str = "https://maven.aliyun.com/repository/google" // str("https://maven.aliyun.com/repository/google") // 会报错 ``` ### 检查第三方库或框架 有时候,第三方库或者框架可能会对字符串进行一些扩展,从而引发这个错误。要检查是否有这样的情况,并确保使用这些库时遵循其正确的使用方式。 ### 调试输出变量类型 在代码里添加调试信息,输出变量的类型,从而确认变量类型是否符合预期: ```groovy def someVar = "https://maven.aliyun.com/repository/google" println(someVar.getClass()) // 输出变量类型,确保是预期的类型 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值