<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中下划线的所有其他用法的信息。
这些查询是:select*from t1 where col1='123'[t1由col1 bucketted]select*from t1 where col2='123'[col2不是bucketting列]我的问题是 > 如何确定在查询执行期间正在进行全表扫描还是正在进行相关的部分表扫描? 我能从DAG或物理计划中得到任何信息吗?我两个都看过,但我看不出有什么不同,就像我在物理计划中看到的那
请帮帮我,我是一个完全的傻瓜,当涉及到火花和Haddop一般。我的代码如下所示: 我的Spark集群作为一个集群部署在10.1.50.165中,运行RHEL6,当我运行这段简单的代码时,在尝试读取json文件时,我遇到了如下异常:
问题内容: 问题 我想在Java中创建一个用户定义函数,可以将其称为Apache Spark运算符链中的Java方法。我在查找不需要UDF存在于SQL查询中的Java示例时遇到了麻烦。 版本号 Java 8 斯卡拉2.10.6 为Hadoop 2.6.0预先构建的Apache Spark 1.6.0 我尝试过的方法 我可以用Java成功创建UDF。但是,除非在SQL查询中,否则无法使用它: 我被困
我正在处理数据帧,需要提取数据。我有许多嵌套的级别,所以我使用分解和选择来创建第一个级别,但随后我对嵌套级别使用UDF。 我有一个UDF,它取Root.Obj,这是一个数组,我希望它返回一个数组[MyObj] 我的输出类: 简而言之,这是输入模式: 我的自定义项: 这是更复杂的IRL,因为我需要从其他地方检索值,并且有更多的嵌套数组。此外,Obj和FieldC的输入结构比这里复杂得多,我不能(或不
我正在尝试使用一个继承的Scala函数(stuctType.diff())并获得一个NoSuchMethodError。 有人有什么想法吗?我使用的是Spark 1.6.2和Scala 2.10
问题内容: 希望您能帮到我。我有一个DF,如下所示: 我很乐意做一个groupBy prodId并汇总“值”,以将其汇总为由“ dateIns”和“ dateTrans”列之间的差异所定义的日期范围。特别是,我希望有一种方法来定义一个条件总和,该总和将上述各列之间的预定义最大差之内的所有值相加。即从dateIns开始的10、20、30天之间发生的所有值(’dateTrans’-‘dateIns’<