2015-05-25 11 views
16

Durante l'esecuzione di "pacchetto SBT" dalla riga di comando per una piccola applicazione Spark Scala, sto ottenendo il "valore $ non è membro di StringContext" errore di compilazione nella seguente riga di codice:

val joined = ordered.join(empLogins, $"login" === $"username", "inner") 
    .orderBy($"count".desc) 
    .select("login", "count") 

Intellij 13.1 mi sta dando lo stesso messaggio di errore. Lo stesso codice sorgente .scala viene compilato senza alcun problema in Eclipse 4.4.2. Inoltre, funziona bene con Maven in un progetto Maven separato dalla riga di comando.

Sembra che sbt non riconosca il segno $ perché mi manca qualche plugin nel mio file project/plugins.sbt o qualche impostazione nel mio file build.sbt.

Hai familiarità con questo problema? Ogni suggerimento sarà apprezzato. Posso fornire build.sbt e/o project/plugins.sbt se necessario.

+0

Probabilmente sarebbe d'aiuto se dovessi descrivere cosa pensi che '$' fa. Hai un'importazione speciale? Usi i plugin? So che hai già parlato dei plugin, ma se già sospetti, perché non hai condiviso i plugin usati? –

risposta

50

È necessario assicurarsi che si import sqlContext.implicits._

In questo modo si ottiene implicit class StringToColumn extends AnyRef

Che viene commentato come:

Converte $ "nome col" in una colonna.

2

Grandi ragazzi di risposta, se la risoluzione di importazione è una preoccupazione, quindi sarà questo lavoro

import org.apache.spark.sql.{SparkSession, SQLContext} 
val ss = SparkSession.builder().appName("test").getOrCreate() 
val dataDf = ... 

import ss.sqlContext.implicits._ 
dataDf.filter(not($"column_name1" === "condition")) 
12

In Spark 2.0+

$ -notation per le colonne possono essere utilizzati importando implicita su SparkSession oggetto (spark)

val spark = org.apache.spark.sql.SparkSession.builder 
     .master("local") 
     .appName("App name") 
     .getOrCreate; 

import spark.implicits._ 

quindi il tuo codice con notazione $

val joined = ordered.join(empLogins, $"login" === $"username", "inner") 
    .orderBy($"count".desc) 
    .select("login", "count")