2017-05-19 6 views
1

ich eine Dataframe genannt Quelle haben, eine Tabelle aus mysqlWie konvertiert RDD [Row] zu RDD [Zeichenfolge]

val source = sqlContext.read.jdbc(jdbcUrl, "source", connectionProperties) 

ich es RDD von

val sourceRdd = source.rdd 

aber seine RDD umgewandelt haben [Row] ich brauche RDD [Zeichenfolge] Transformationen zu tun, wie

source.map(rec => (rec.split(",")(0).toInt, rec)), .subtractByKey(), etc.. 

Danke

+0

Können Sie die Ausgabe von 'source.printSchema' hinzufügen? Ich möchte Ihnen zeigen, wie Sie vermeiden können, auf RDD-Ebene zu gehen (was Sie nicht um jeden Preis tun sollten). –

Antwort

3

Sie Row. mkString(sep: String): String Methode in einem map Aufruf wie folgt verwendet werden:

val sourceRdd = source.rdd.map(_.mkString(",")) 

Sie können den Parameter "," nach Ihren Wünschen ändern.

Ich hoffe, dies hilft Ihnen, mit freundlichen Grüßen.

+0

Wenn es einige Komma "," in String, dann wird Ihre Methode wahrscheinlich scheitern –

+0

@ T.Gawęda Wenn Sie über die Zeichenfolge, die wir wollen, zu sprechen, so müssen wir vermeiden das '", "' und änderte es durch ein anderes Trennzeichen –

1

Was ist Ihr Schema?

Wenn es nur ein String, können Sie:

import spark.implicits._ 
val sourceDS = source.as[String] 
val sourceRdd = sourceDS.rdd // will give RDD[String] 

Hinweis: Verwenden Sie SqlContext statt Funken in Funken 1.6 - Funke ist ein SparkSession, die in Spark-2.0 eine neue Klasse und ist ein neuer Eintrag zeigen Sie auf SQL-Funktionalität. Es sollte anstelle von SQLContext in Spark 2.x verwendet werden.

Sie können auch eigene Fallklassen erstellen.

Sie können auch Zeilen anzeigen - hier Quelle ist vom Typ Datenrahmen verwenden wir Teilfunktion in der Karte Funktion:

val sourceRdd = source.rdd.map { case x : Row => x(0).asInstanceOf[String] }.map(s => s.split(",")) 
+0

Ich habe versucht, die erste Methode, es Fehler - Unable Encoder für Typ in einem Datensatz gespeichert zu finden. Primitive Typen (Int, String usw.) und Produkttypen (Fallklassen) werden durch den Import von sqlContext.implicits unterstützt. Unterstützung für die Serialisierung anderer Typen wird in zukünftigen Versionen hinzugefügt. nicht genug Argumente für die Methode als: (impliziter Beweis $ 1: org.apache.spark.sql.Encoder [String]) org.apache.spark.sql.Dataset [String]. Nicht näher bezeichneter Wert gibt $ 1 an. – Vickyster

+0

für die zweite Methode --value split ist kein Mitglied von Any – Vickyster

+1

@Vickyster Ok Ich habe den Code geändert, jetzt sollte es funktionieren :) –

Verwandte Themen