2015-01-28 2 views
0

Another question привести меня к необходимости создания последовательности выражений Scala. Кажется, я не могу этого сделать.Как создать последовательность выражений 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), [email protected], []), [] 

и я хочу, чтобы спроецировать его на две колонки. 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?

+0

Возможный дубликат [Spark Sql not load катализатор?] (Http: // stackoverflow. com/questions/25745396/spark-sql-not-load-catal) – sds

+0

, что другой вопрос совсем не похож на этот. – javadba

+0

тем не менее, тот же ответ применяется :-) – sds

ответ

0

из частной электронной почты:

Похоже, вы пропустили этот импорт:

import sqc._ 

где sqc ваша SqlContext переменная (так что это немного отличается от import SqlContext._).

Это загружает кучу неявных функций, которые преобразуют символы в выражение.

Если вы не сталкивались с неявными функциями в scala, это в основном способ определить функцию для прозрачного преобразования одного типа в другой. например если я определить такую ​​функцию, которая принимает экземпляр Bar и возвращает Foo:

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

Затем в коде где у меня есть функция, которая рассчитывает на Foo я могу передать его Bar вместо и компилятор введет вызов toFoo() в фоновом режиме (т. е. «неявно»).

Это одна из самых причудливых особенностей скалы и очень обоюдоострый меч. Он позволяет писать очень мощные и сжатые DSL, но в то же время вводит много магии, которая может сделать код невозможным: -/

Смежные вопросы