如何在 Spark SQL 中启用 Postgis 查询

Posted

技术标签:

【中文标题】如何在 Spark SQL 中启用 Postgis 查询【英文标题】:How to enable Postgis Query in Spark SQL 【发布时间】:2018-01-17 16:18:38 【问题描述】:

我有一个带有 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】:

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

你可以用 Scala 做同样的事情。使用 JDBC (java.sql.Connection,DriverManager) 并获取结果集。

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

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

In Apache Spark 2.0.0, is it possible to fetch a query from an external database (rather than grab the whole table)? How to use SQL query to define table in dbtable?

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

【讨论】:

谢谢!我为 PostgreSQL 找到了一个 Slick extension,它支持 PostGIS。但是因为我需要从 Spark 访问 PostgreSQL,而且我更喜欢纯 SQL,在这种情况下,像 Slick 这样主要用于异步交互的库可能不是一个好的选择。所以正如你所建议的,我只使用 java JDBC,它可以工作。

以上是关于如何在 Spark SQL 中启用 Postgis 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eclipse Hibernate 工具对启用 PostGIS 的数据库进行逆向工程?

如何使用 jupyter notebook 在 pyspark 中的 Hive 上使用 %sql Magic 字符串启用 spark SQL

kerberized Hadoop 环境中的 Spark 和启用的高可用性:Spark SQL 只能在写入任务后读取数据

如何平均单个 PostGIS 栅格表中的所有波段?

如何在 Pyspark 中启用 Apache Arrow

如何在 spark-shell (spark 2.1.1) 中启用对 spark 的 Hive 支持