GeoMesa Spark 无法使用geohash

GeoMesa Spark can't use geohash

我在 Databricks 集群上使用 GeoMesa Spark,参考了这个示例笔记本:GeoMesa - NYC Taxis。我在导入和使用 UDF 函数(例如 st_makePointst_intersects 时没有遇到任何问题。但是,当我尝试使用 st_geoHash 创建点的 geohash 列时,出现此错误:

NoClassDefFoundError: Could not initialize class org.locationtech.geomesa.spark.jts.util.GeoHash$.

集群安装了geomesa-spark-jts_2.11:3.2.1scala-logging_2.11:3.8.0,这是notebook给出的两个(但是GeoMesa的版本不同,notebook中是2.3.2而3.2 .1 在我的集群上)。我是 GeoMesa 和 Databricks 平台的新手。我想知道我是否错过了 Geohash class 工作的一些依赖项。

我建议您安装与 notebook.

中相同版本的 geomesa-spark-jts_2.11

要安装 geomesa-spark-jts_2.11:2.3.2,请按照以下步骤操作:

第一步:点击安装库。

第二步: Select Maven,搜索并安装 geomesa-spark-jts_2.11:2.3.2.

步骤 3:您也可以下载 jar 文件并将其上传到库源。

(10 月 18 日更新)我和主要作者 Derek Yeager 是本笔记本的原始贡献者之一。像 geomesa 这样的复杂框架可能需要更多的特别关注,因为我们对集群的 UI maven 支持是为简化库安装而构建的,更多 here. The notebook was originally built for Spark 2.4 (DBR 6.x) on a fat jar of geomesa that we generated back at that time (late 2019). That jar shaded some dependency conflicts with DBR. Instead of the fat jar, you could use Databricks Container Services 这对于在我们的集群上部署更复杂的框架很有用。应该提到 DBR 7+ / Spark 3+ 只是 Scala 2.12,所以你不会期望 Scala 2.11 在这些运行时上工作。

CCRi(geomesa 的支持者)已经生成了 Databricks 友好的构建。 GeoMesa(当前版本为 3.3.0)的着色 fat jar 在 maven 坐标 org.locationtech.geomesa:geomesa-gt-spark-runtime_2.12:3.3.0 处可用,用于 spark 运行时(例如 Databricks)。 由于它是着色的,用户可以添加 maven排除以使其干净安装,这将是“jline:*,org.geotools:*”添加到 Databricks 库 UI 中,不带引号。我已经能够在 DBR 9.1 LTS(对于 Spark 3.1)上执行您引用的笔记本(有一些小的变化)。

  1. 与初始笔记本相比的一个变化是您不再需要专门添加 com.typesafe.scala-logging:scala-logging_2.11:3.8.0
  2. 另一个是您无法在会话中更改 spark 配置,因此您将最少注释掉(如果需要,可能会添加到集群配置):
// spark.conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
// spark.conf.set("spark.kryo.registrator", classOf[GeoMesaSparkKryoRegistrator].getName) 
// spark.conf.set("spark.kryoserializer.buffer.max","500m")
  1. 注释掉倾斜提示并让 Spark 3.x AQE 处理:
//short circuit on geohash and apply geospatial predicate when necessary

val joined = trips.as("L")
    // - let AQE handle skew
    //.hint("skew", "pickup_geohash_25", pickup_skews).as("L")
    .join(
      neighborhoodsDF.as("R"),
      ( $"L.pickup_geohash_25" === $"R.geohash" ) && 
      ( st_contains($"R.polygon", $"L.pickupPoint") )
    )
    .drop("geohashes")
    .drop("geohash")
    .drop("polygon")

我可以访问我们制作笔记本的 Databricks 环境中的所有数据,所以我假设如果您尝试执行笔记本副本,您正在以某种方式重构您这边的数据。