如何创建Scala表达式序列?

时间:2015-01-28 02:12:38

标签: scala apache-spark

Another question让我需要创建一系列Scala表达式。我似乎无法做到这一点。

我有一个SchemaRDD对象z

org.apache.spark.sql.SchemaRDD =
SchemaRDD[0] at RDD at SchemaRDD.scala:103
== Query Plan ==
== Physical Plan ==
ParquetTableScan [event_type#0,timestamp#1,id#2,domain#3,code#4], (ParquetRelation ...., Some(Configuration: core-default.xml, core-site.xml, yarn-default.xml, yarn-site.xml, mapred-default.xml, mapred-site.xml, hdfs-default.xml, hdfs-site.xml), org.apache.spark.sql.SQLContext@e7f91e, []), []

我希望将它投影在两列上。 select应该是答案:

z.select _
res19: Seq[org.apache.spark.sql.catalyst.expressions.Expression] => org.apache.spark.sql.SchemaRDD = <function1>

但是,我似乎无法生成Seq[Expression],例如:

z.select(Seq('event_type,'code))
<console>:21: error: type mismatch;
 found   : Seq[Symbol]
 required: org.apache.spark.sql.catalyst.expressions.Expression
              z.select(Seq('event_type,'code))
                          ^

或:

z.select('event_type,'code)
<console>:21: error: type mismatch;
 found   : Symbol
 required: org.apache.spark.sql.catalyst.expressions.Expression
              z.select('event_type,'code) 
                       ^

我认为符号是一种表达......

那么,我该如何调用select

1 个答案:

答案 0 :(得分:0)

来自私人电子邮件:

您似乎错过了此导入:

import sqc._

其中sqc是您的SqlContext变量(因此它与import SqlContext._略有不同)。

这会加载一组将符号转换为Expression的隐式函数。

如果您还没有在scala中遇到隐式函数,那么它基本上是一种定义函数以透明地将一种类型转换为另一种类型的方法。例如如果我定义一个这样的函数,它接受一个Bar实例并返回一个Foo:

implicit def toFoo(bar : Bar) : Foo = new Foo(bar.toString)

然后,在代码中我有一个期望Foo的函数的任何地方我可以将它传递给Bar而编译器将在后台引入toFoo()调用(即&#34;含蓄地&#34;)。

这是斯卡拉最古怪的特征之一,也是一把双刃剑。它可以让你编写非常强大和简洁的DSL,但同时引入了很多可以使代码无法遵循的魔法: - /