How to enable Postgis Query in Spark SQL
我有一个带有 Postgis 扩展的 PostgreSQL 数据库,所以我可以进行如下查询:
1 2 3 | SELECT * FROM poi_table WHERE (ST_DistanceSphere(the_geom, ST_GeomFromText('POINT(121.37796 31.208297)', 4326)) < 6000) |
使用 Spark SQL,我可以在我的 Spark 应用程序(在 Scala 中)中查询表,例如:
1 | spark.sql("select the_geom from poi_table where the_geom is not null").show |
问题是,Spark SQL 不支持 Postgis 扩展。例如,当我使用 Postgis 函数
1 2 3 4 | 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?
With Python, I can create a Postgresql connection and send this query to Postgresql server to execute it.
你可以用 Scala 做同样的事情。使用 JDBC (
Or even better, any jar I can use to enable Spark SQL supporting Postgis extension
你不能,因为这不是 Postgres 查询。您在
- 在 Apache Spark 2.0.0 中,是否可以从外部数据库获取查询(而不是获取整个表)?
- 如何使用 SQL 查询在 dbtable 中定义表?
也许它会满足您的要求(如果查询不必是动态的)。不幸的是,Spark SQL 也不支持几何类型,因此可能必须将其转换为 Spark 可以使用的东西或定义自己的方言。