我有一个带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吗?
答案 0 :(得分:2)
使用Python,我可以创建Postgresql连接并将此查询发送到Postgresql服务器以执行它。
您可以使用Scala执行相同的操作。使用JDBC(java.sql.{Connection,DriverManager}
)并获取结果集。
甚至更好,我可以使用任何jar来启用支持Postgis扩展的Spark SQL
你不能,因为这不是Postgres查询。您在spark.sql
中执行的操作是Spark查询。你可以做的是使用子查询:
也许它符合您的要求(如果查询不必是动态的)。不幸的是,Spark SQL也不支持几何类型,因此可能需要将其转换为Spark可以使用的东西或定义自己的方言。