2016-12-19 7 views
0

Ich benutze Scala 2.11.8 und Spark 2.0.1 zum Ausführen meiner Codes. In dieser Codezeile:Fehler beim Ausführen von Scala und Spark

import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 

object training { 
    def main(args: Array[String]): Unit = { 
    val conf = new SparkConf().setAppName("test").setMaster("local[4]") 
    val sc = new SparkContext(conf) 
    val data = sc.textFile("/home/ahoora/data.csv") 

    // create RDDs from data in form (user, product, price) 
    data.map(line => line.split(",")).map(purchaserecord => (purchaserecord(0), purchaserecord(1), purchaserecord(2))) 

    // Our total revenue 
    val totalRevenue = data.map{ case (user, product, price) => price.toDouble}.sum() 
    sc.stop() 
    } 
} 

Dieser Code basiert auf Scala 2.10.x und Spark-1.x, ich glaube, der Fehler, da die Versionierung ist. Ich lese Daten aus einer .csv-Datei aufgeteilt in (Benutzer, Produkt, Preis) als RDD. Alle Dinge waren korrekt, aber hier ist die Methode toDouble nicht gelöst. Was ist der richtige Weg, das zu tun?

Daten sind in Form

ali, Lebensmittel, 123

in CSV-Datei

+0

Bitte fügen Sie den Fehler, den Sie und ausreichend Code haben Ihr Problem zu reproduzieren . – maasg

+0

Haben Sie den Code neu kompiliert? Wenn Sie Code verwenden, der in scala 2.10.x kompiliert wurde, führt dies zu Problemen. Und was ist die Art von Preis? Wenn Sie es von irgendwo gelesen haben, wurde es möglicherweise in einen nicht unterstützten Typ konvertiert. Wenn der Preis beispielsweise eine Zeichenfolge ist, die kein Double ist, kann dies zu Problemen führen. Auch wenn String eine Null ist, kann dies ähnliche Probleme verursachen. Was ist Ihre genaue Fehlermeldung? –

Antwort

1

Sie die ursprüngliche data mit durch Spaltung und nicht die modifizierte RDD erstellt (die RDD[String] Typ hat) die Zeichenfolge in 3-Tupel (die den Typ RDD[(String, String, String)] hat). RDDs sind unveränderlich, wenn Sie das Ergebnis einer Transformation verwenden möchten (wie map) benötigen Sie den Wert aus dieser Transformation zurück verwenden:

val data = sc.textFile("/home/ahoora/data.csv") 

// create RDDs from data in form (user, product, price) 
val split = data.map(line => line.split(",")).map(purchaserecord => (purchaserecord(0), purchaserecord(1), purchaserecord(2))) 

// Our total revenue 
val totalRevenue = split.map{ case (user, product, price) => price.toDouble}.sum() 
Verwandte Themen