2016-05-10 10 views
0

Ich habe einen Code wie dieserFall Karte funktioniert nicht in Funken Shell

val pop = sc.textFile("population.csv") 
.filter(line => !line.startsWith("Country")) 
.map(line => line.split(",")) 
.map { case Array(CountryName, CountryCode, Year, Value) => (CountryName, CountryCode, Year, Value) } 

Die Datei sieht wie folgt aus.

Country Name,Country Code,Year,Value 
Arab World,ARB,1960,93485943 
Arab World,ARB,1961,96058179 
Arab World,ARB,1962,98728995 
Arab World,ARB,1963,101496308 
Arab World,ARB,1964,104359772 
Arab World,ARB,1965,107318159 
Arab World,ARB,1966,110379639 
Arab World,ARB,1967,113543760 
Arab World,ARB,1968,116787194 

bis zum .map {Fall}, ich pop.take ausdrucken können (10), Und ich Array [Array [String]] erhalten. Aber sobald der Fall hinzugefügt wird, ich bin immer

error: not found: value (all columns) 

alle Spalten was bedeuten, 4 verschiedene Fehler mit Country, Countrycode, Jahr, Wert, etc ... nicht sicher, wo ich falsch mache. Die Daten sind sauber.

Antwort

1

Sie müssen Kleinbuchstaben Variablennamen im Mustervergleich verwenden. D.h:

.map { case Array(countryName, countryCode, year, value) => (countryName, countryCode, year, value) } 

In Scala Musteranpassungsvariablen, sowie Variablen eingeschlossen in Backticks Aktivieren sind (') wird von äußeren Umfang entnommen und als Konstanten verwendet. Hier ist ein Beispiel zu veranschaulichen, was ich sage:

Array("a") match { 
    case Array(a) => a 
} 

Wird Array übereinstimmen mit einer beliebigen Zeichenkette, während:

val A = "a" 
Array("a") match { 
    case Array(A) => 
} 

nur wörtlichen "a" übereinstimmen. Oder äquivalent:

val a = "a" 
Array("a") match { 
    case Array(`a`) => 
} 

wird auch nur literal "a" übereinstimmen.