Scala 为什么部分应用的函数在两个相似的场景中表现不同

Scala 为什么部分应用的函数在两个相似的场景中表现不同,scala,function,Scala,Function,我正在创建一个函数,该函数将连接字符串、SQL查询和连接属性作为参数。 第一个方案工作正常,但第二个方案失败,出现了上述错误 第一种情况有效: 上面两行给了我DataFrame类型的数据值 第二种情况: 现在,我正在尝试创建一个函数,该函数可以作为助手函数从任何地方调用,这样我们就不必为创建的每个SQL语句传递连接字符串和连接属性,如下所示: import org.apache.spark.sql.DataFrame def PerformSqlOperations(): Str

我正在创建一个函数,该函数将连接字符串、SQL查询和连接属性作为参数。 第一个方案工作正常,但第二个方案失败,出现了上述错误

第一种情况有效:

上面两行给了我DataFrame类型的数据值

第二种情况:

现在,我正在尝试创建一个函数,该函数可以作为助手函数从任何地方调用,这样我们就不必为创建的每个SQL语句传递连接字符串和连接属性,如下所示:

    import org.apache.spark.sql.DataFrame
    def PerformSqlOperations(): String => DataFrame = {
         spark.read.jdbc(connectionString,_:String,connectionProps)
    }
    PerformSqlOperations("(SELECT * FROM TestTable) as TestTable")   
该函数可以正确编译,但是,当我通过传递Sql查询调用此函数以执行时,如下所示:

    import org.apache.spark.sql.DataFrame
    def PerformSqlOperations(): String => DataFrame = {
         spark.read.jdbc(connectionString,_:String,connectionProps)
    }
    PerformSqlOperations("(SELECT * FROM TestTable) as TestTable")   
现在我得到的错误是方法PerformSqlOperations的参数太多

我无法理解为什么会发生这种情况,因为上面的代码与此类似,我只是尝试将其封装在函数中,以简化多个调用

任何帮助或想法都有助于让我知道为什么函数创建和执行会出现上述错误

import org.apache.spark.sql.DataFrame  
def PerformSqlOperations: String => DataFrame = {
    spark.read.jdbc(connectionString,_:String,connectionProps)  
}  

您只需要删除函数名后面的。删除括号后,它将按预期工作

def PerformSqlOperations似乎缺少一个输入参数,请尝试def PerformSqlOperationsquery:String。@MarioGalic在部分应用的函数中使用下划线时,如果我理解正确,则在调用传递了参数的函数时将采用下划线。问题其实很简单。在第一种情况下,readSqlData是String=>DataFrame中的一个函数。然而,在第二种情况下,PerformSqlOperations是一种非常依赖于函数的方法,该函数不接受任何参数,并从String=>DataFrame返回函数。第二种情况必须像PerformSqlOperationsSELECT*一样从TestTable中调用,因为TestTable首先是空括号,然后是函数。但是,这似乎一点用处都没有。所以,或者只保留第一个示例中的函数。或者将第二个重写为def PerformSqlOperationsquery:String:DataFrame=spark.read.jdbcconnectionString,query,connectionProps。感谢@MarioGalic和luis的建议,因为这迫使我尝试了一些选项,而且效果很好。为什么要使用始终返回相同函数的方法?为什么不在第一个例子中使用val呢?因为我希望在不同的类中从不同的位置多次调用它。因此,我想创建一个函数并从任何地方调用它,并且只将该查询作为参数传递。您可以对val执行完全相同的操作。或者不使用返回函数的方法,而只使用接受查询并返回数据帧的方法。正如我在其他评论中所显示的那样。