2016-06-06 4 views
2

Ich versuche, Funken zu einer PostgreSQL-Datenbank mit Postgis zu verbinden.
ich es auf diese Weise verbinden:Gibt es eine Möglichkeit, Spark mit einem Postgis-Geometrietyp mit einer Tabelle zu verbinden?

val jdbcDF = sc.read.format("jdbc").options(
     Map("url" -> "jdbc:postgresql://dbHost:5432/ticketapp?user=user&password=password", 
     "dbtable" -> "events", 
     "columnNames" -> "name") 
    ).load() 

Das Problem ist, dass Funken kennt nicht die Geometry Typ. (Ich bekomme den folgenden Fehler: SQLException: Unsupported type 1111)

Gibt es eine Möglichkeit, damit es funktioniert?

Wenn nicht, gibt es eine Möglichkeit, weiterhin eine Verbindung zu dieser Tabelle herzustellen, ohne das problematische Feld vom Typ Geometrie zu verwenden? Kann ich dieses Feld ausschließen, damit es funktioniert, ohne dass ein Speicherauszug der Tabelle ohne dieses Feld erstellt werden muss?

Antwort

3

Unglücklicherweise kennt Spark SQL den Geometrietyp nicht [1, 2]. Wenn Sie das problematische Feld nicht benötigen, können Sie es ausschließen.

Mit jdbc können Sie eine Unterabfrage angeben, gefolgt von einem Namen für eine temporäre Tabelle anstelle von nur einem Tabellennamen [3]. Dies ist nützlich, wenn Sie eine Teilmenge Ihrer Tabelle auswählen oder in diesem Fall ein Feld ausschließen möchten. Da es keine Möglichkeit in SQL ist alle außer einigen Spalten in einer Tabelle, um [4], müssen Sie explizit die Spalten aufzulisten, die Sie, wie diese behalten wollen:

val jdbcDF = sc.read.format("jdbc").options(
    Map("url" -> "jdbc:postgresql://dbHost:5432/ticketapp?user=user&password=password", 
     "dbtable" -> "(select col1,col2 from events) tmp") 
).load() 

[1] https://issues.apache.org/jira/browse/SPARK-11526
[ 2] https://github.com/harsha2010/magellan/issues/31
[3] http://metricbrew.com/get-data-from-databases-with-apache-spark-jdbc/
[4] http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html