2016-05-12 6 views
0

Können sagen, ich bin eine flache Datei von HDFS in Funken mit so etwas wie das folgende Import:Array TUPLE Spark mit vielen Eingangsvariablen

val data = sc.textFile("hdfs://name_of_file.tsv").map(_.split('\t')) 

Dieses eine Array[Array[String]] produzieren wird. Wenn ich ein Array von Tupeln wollte, könnte ich tun, wie in diesem solution referenziert und die Elemente zu einem Tupel zuordnen.

val dataToTuple = data.map{ case Array(x,y) => (x,y) } 

Aber was ist, wenn meine Eingabedaten sagen, 100 Spalten? Gibt es einen Weg in Scala mit einer Art Wildcard zu sagen

ohne zu schreiben auf 100 Variable zu passen auf?

Ich habe versucht, so etwas wie

val dataToTuple = data.map{ case Array(_) => (_) } 

tun, aber das scheint nicht viel Sinn zu machen.

+0

Warum sollten Sie ein Tupel mit 100 Elementen haben? Verwenden Sie einfach das Array, das 'split' erzeugt? –

+0

Sie können eine Zeile anstelle eines Tuple –

+1

erstellen, wenn Sie wirklich brauchen - Sie können Shapeless-Bibliothek verwenden: http://StackOverflow.com/A/19901310/1809978, aber beachten Sie, dass die maximale Größe des Tupels ist in scala auf 22 begrenzt (das letzte Mal, als ich es überprüft habe) + Ich glaube, Sie müssen noch Typ pro Spalte angeben. Außerdem ist es vielleicht nicht das, was Sie wirklich brauchen – dk14

Antwort

1

Wenn Ihre Datenspalten homogen sind (wie Array von String s) - ist Tuple möglicherweise keine optimale Lösung zur Verbesserung der Typensicherheit. Alles, was Sie tun können, ist die Größe der Array Größe Liste von Shapeless Bibliothek zu beheben: Wenn Ihre Spalt sind unbenannte

How to require typesafe constant-size array in scala?

Dies ist ein richtiger Ansatz ist. Zum Beispiel könnte Ihre Zeile eine Darstellung eines Vektors im euklidischen Raum sein.

Ansonsten (benannte Spalten, möglicherweise verschiedene Typen), ist es besser, es mit einer Fallklasse zu modellieren, aber beachten Sie size restriction. Dies könnte Ihnen helfen, das Array (oder Teile davon) schnell dem ADT zuzuordnen: https://stackoverflow.com/a/19901310/1809978