2016-09-18 2 views
0

Ich versuche, die Eingabe Textdatei in eine Schlüssel/Wert-RDD zu transformieren, aber der folgende Code funktioniert nicht. (Die Textdatei ist eine Registerkarte getrennte Datei.) Ich bin wirklich neu Scala und Spark, also würde ich deine Hilfe sehr schätzen.Transformieren von Daten mit Scala in Spark

import org.apache.spark.{SparkConf, SparkContext} 
import scala.io.Source 

object shortTwitter { 

    def main(args: Array[String]): Unit = { 
    for (line <- Source.fromFile(args(1).txt).getLines()) { 
     val newLine = line.map(line => 
     val p = line.split("\t") 
     (p(0).toString, p(1).toInt) 
    ) 
} 

    val sparkConf = new SparkConf().setAppName("ShortTwitterAnalysis").setMaster("local[2]") 
    val sc = new SparkContext(sparkConf) 
    val text = sc.textFile(args(0)) 
    val counts = text.flatMap(line => line.split("\t")) 
    } 
} 
+0

"Code unten funktioniert nicht" - wie? Was ist der Fehler? –

Antwort

1

Ich gehe davon aus Sie die resultierenden RDD wollen RDD[(String, Int)] den Typen haben, so -

  • Sie map verwenden sollen (die jeden Datensatz in einen einzigen neuen Rekord verwandelt) und nicht flatMap (die verwandeln jeden Datensatz in mehrere Datensätze)
  • Sie sollten
das Ergebnis der split in ein Tupel Karte Insgesamt

:

val counts = text 
    .map(line => line.split("\t")) 
    .map(arr => (arr(0), arr(1).toInt)) 

EDIT pro Klärung in Kommentar: Wenn Sie auch daran interessiert sind, die nicht-Spark-Befestigungsteil (die die Datei liest sequentiell), haben Sie einige Fehler in der für Verständnis Syntax, hier ist die ganze Sache:

def main(args: Array[String]): Unit = { 
    // read the file without Spark (not necessary when using Spark): 
    val countsWithoutSpark: Iterator[(String, Int)] = for { 
    line <- Source.fromFile(args(1)).getLines() 
    } yield { 
    val p = line.split("\t") 
    (p(0), p(1).toInt) 
    } 

    // equivalent code using Spark: 
    val sparkConf = new SparkConf().setAppName("ShortTwitterAnalysis").setMaster("local[2]") 
    val sc = new SparkContext(sparkConf) 
    val counts: RDD[(String, Int)] = sc.textFile(args(0)) 
    .map(line => line.split("\t")) 
    .map(arr => (arr(0), arr(1).toInt)) 
} 
+0

Außerdem sagt der Fehler 'illegaler Start des einfachen Ausdrucks, val p = line.split ("\ t"). Wegen dieses Fehlers kann ich den Code überhaupt nicht ausführen – tobby

+1

Oh ich sehe, ich dachte, dass Code nur dazu gedacht war zu klären, was Sie mit Spark zu tun versuchen, sehe ich keinen Sinn in der Verwendung beider Teile - man liest die Datei nacheinander und man benutzt Spark, um das Gleiche zu tun ... Wie auch immer - siehe aktualisierte Antwort. –

+0

Danke! Der zweite Teil war der Code, um etwas anderes zu tun. Sorry für die Verwirrung lol .. und noch eine Frage! Wie kann ich mit "print" das Ergebnis von Codes ohne Funke überprüfen? – tobby