<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)的源代码:
@transient
protected[sql] val ddlParser = new DDLParser(sqlParser.apply(_))
@transient
protected[sql] val sqlParser = {
val fallback = new catalyst.SqlParser
new SparkSQLParser(fallback(_))
}
protected[sql] def parseSql(sql: String): LogicalPlan = {
ddlParser(sql, false).getOrElse(sqlParser(sql))
}
我真的不能理解上面的代码。
sqlParser.apply(_)
是如何工作的?(_) 在地球上是什么?DDLParser 的构造函数需要一个参数解析查询:字符串 =
回退(_)
也是应用
调用,(_)是如何工作的?
在这种情况下,下划线表示部分函数应用程序,这是将方法类型转换为函数类型的一种方式。所以当您编写< code>sqlParser.apply(_)时,它等效于< code>x =
这里有很多选择。在大多数情况下,以下内容相当:
new DDLParser(x => sqlParser.apply(x))
new DDLParser(x => sqlParser(x))
new DDLParser(sqlParser.apply(_))
new DDLParser(sqlParser.apply _)
new DDLParser(sqlParser(_))
new DDLParser(sqlParser _)
new DDLParser(sqlParser.apply)
new DDLParser(sqlParser)
你可以在这里阅读更多关于方法类型和函数类型的区别。
将方法类型转换为函数类型的另一种密切相关的方法称为 eta 扩展,它在某些上下文中可互换使用。在这里阅读有关部分函数应用,eta扩展以及Scala中下划线的所有其他用法的信息。