如何在Spark SQL中启用Postgis Query

时间:2018-01-17 16:18:39

标签: postgresql apache-spark postgis

我有一个带Postgis扩展的PostgreSQL数据库,所以我可以进行如下查询:

SELECT *
FROM poi_table
WHERE (ST_DistanceSphere(the_geom, ST_GeomFromText('POINT(121.37796 31.208297)', 4326)) < 6000)

使用Spark SQL,我可以在我的Spark应用程序(在Scala中)查询表格,如:

spark.sql("select the_geom from poi_table where the_geom is not null").show

问题是,Spark SQL不支持Postgis扩展。例如,当我使用Postgis函数ST_DistanceSphere查询表时,出现了这样的错误:

scala> spark.sql("select * FROM poi_table WHERE (ST_DistanceSphere(the_geom, ST_GeomFromText('POINT(121.37796 31.208297)', 4326)) < 60)")
org.apache.spark.sql.AnalysisException: Undefined function: 'ST_DistanceSphere'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 65
  at
...

使用Python,我可以创建Postgresql连接并将此查询发送到Postgresql服务器以执行它。

那么,Spark / Scala中是否有类似的解决方法? 或者甚至更好,我可以使用任何jar来启用支持Postgis扩展的Spark SQL吗?

1 个答案:

答案 0 :(得分:2)

  

使用Python,我可以创建Postgresql连接并将此查询发送到Postgresql服务器以执行它。

您可以使用Scala执行相同的操作。使用JDBC(java.sql.{Connection,DriverManager})并获取结果集。

  

甚至更好,我可以使用任何jar来启用支持Postgis扩展的Spark SQL

你不能,因为这不是Postgres查询。您在spark.sql中执行的操作是Spark查询。你可以做的是使用子查询:

也许它符合您的要求(如果查询不必是动态的)。不幸的是,Spark SQL也不支持几何类型,因此可能需要将其转换为Spark可以使用的东西或定义自己的方言。