2015-07-22 6 views
5

Hallo Ich habe einen Datenrahmen, die ich brauche in JavaRDD zu konvertieren und zurück zu Datenrahmen Ich habe den folgenden CodeSpark-Datenrahmen von JavaRDD erstellt <Row> kopiert alle Spalten Daten in die erste Spalte

DataFrame sourceFrame = hiveContext.read().format("orc").load("/path/to/orc/file"); 
//I do order by in above sourceFrame and then I convert it into JavaRDD 
JavaRDD<Row> modifiedRDD = sourceFrame.toJavaRDD().map(new Function<Row,Row>({ 
    public Row call(Row row) throws Exception { 
     if(row != null) { 
      //updated row by creating new Row 
      return RowFactory.create(updateRow); 
     } 
     return null; 
}); 
//now I convert above JavaRDD<Row> into DataFrame using the following 
DataFrame modifiedFrame = sqlContext.createDataFrame(modifiedRDD,schema); 

sourceFrame und modifiedFrame Schema ist dasselbe wenn ich sourceFrame.show() Ausgabe anrufe, sehe ich, dass jede Spalte entsprechende Werte hat und keine Spalte leer ist, aber wenn ich modifiedFrame.show() rufe, sehe ich, dass alle Spaltenwerte in erste Spaltenwert für zB zusammengeführt werden nehmen Quelle Datenrahmen hat 3-Säule, wie unten

gezeigt
_col1 _col2 _col3 
ABC  10  DEF 
GHI  20  JKL 

Wenn I modifiedFrame drucken, die ich von JavaRDD konvertiert es in der folgenden Reihenfolge zeigt

_col1  _col2  _col3 
ABC,10,DEF 
GHI,20,JKL 

Wie vor allem die _col1 gezeigt alle Werte und _col2 hat und _col3 ist leer. Ich weiß nicht, was ich falsch mache, bitte, ich bin neu bei Spark danke im Voraus.

+0

Wie lautet Ihre updateRow-Variable genau? –

+0

Ich aktualisiere Zeile durch Konvertieren von Zeilenobjekt in Java-Sammlung Liste von Objekten und dann Aktualisieren eines Feldes Wert und dann diese Liste als Teil von RowFactory.create – u449355

Antwort

8

Wie ich im Kommentar der Frage erwähnte;

Es tritt möglicherweise auf, weil Liste als ein Parameter angegeben wird.

return RowFactory.create(updateRow); 

Bei der Untersuchung Apache Spark Docs und Quellcodes; In diesem specifying schema example Sie weisen Parameter einzeln für alle Spalten jeweils zu. Untersuchen Sie einfach den Quellcode etwa RowFactory.java Klasse und GenericRow Klasse nicht diesen einen Parameter zuweisen. Versuchen Sie, Parameter für die Spalten der Zeile anzugeben.

Sie können versuchen, Ihre Liste in Array zu konvertieren und dann als Parameter übergeben.

YourObject[] updatedRowArray= new YourObject[updateRow.size()]; 
updateRow.toArray(updatedRowArray); 
return RowFactory.create(updatedRowArray); 

Übrigens RowFactory.create() -Methode erstellt Zeilenobjekte. In Apache Spark documentation about Row object and RowFactory.create() method;

Repräsentiert eine Zeile der Ausgabe eines relationalen Operators. Erlaubt beide generischen Zugriffe nach Ordnungszahl, was einen Boxen-Overhead für Grundelemente sowie einen nativen primitiven Zugriff zur Folge hat. Es ist ungültig, die ursprüngliche primitive Schnittstelle zu verwenden, um einen Wert abzurufen, der Null ist, stattdessen muss ein Benutzer IsNullAt überprüfen, bevor versucht wird, einen Wert abzurufen, der null sein kann. Um eine neue Zeile zu erstellen, verwenden Sie RowFactory.create() in Java oder Row.apply() in Scala.

Ein Zeilenobjekt kann durch Bereitstellung von Feldwerten erstellt werden. Beispiel:

Import org.apache.spark.sql._

// Erstellen Sie eine Reihe von Werten.

Row (Wert1, Wert2, Wert3, ...)

// Erstellen Sie eine Zeile aus einem Seq von Werten.

Row.fromSeq (Seq (Wert1, Wert2, ...)))

Laut Dokumentation; Sie können auch Ihren eigenen Algorithmus anwenden, um Zeilenspalten beim Erstellen von Zeilenobjekten zu trennen. Aber ich denke, das Konvertieren von Liste in Array und übergeben Parameter als ein Array wird für Sie arbeiten (ich konnte nicht versuchen, bitte posten Sie Ihre Bewertungen, danke).

+0

Hallo danke für die Antwort. Eigentlich habe ich 45 Felder/Spalten zur Vereinfachung habe ich nur drei Spalten gezeigt. Row Factory.create() nimmt variables Argument, so akzeptiert es Liste Java wird es einen Unterschied machen, wenn ich alle Werte von Hand übergeben – u449355

+0

Hallo, ich habe gerade die Antwort in Bezug auf Ihre Anforderung verbessert. –

+0

Hallo vielen Dank, es funktionierte umwandeln Liste int-Array. – u449355

Verwandte Themen