GeoSpark未定義DBConnect函數錯誤

使用帶有DBConnect會話的GeoSpark代碼。

寫的arjun.kaimaparambilrajan

最後發布時間:2022年6月1日

問題

您正在嚐試使用GeoSpark功能st_geofromwktDBConnect (AWS|Azure|GCP),您就會得到一條Apache Spark錯誤消息。

錯誤:org.apache.spark.sql.AnalysisException: Undefined function: 'st_geomfromwkt'。此函數既不是注冊的臨時函數,也不是注冊在數據庫'default'中的永久函數。

此示例代碼在使用DBConnect時出現錯誤。

%scala val sc = spark。sparkContext sc.setLogLevel("DEBUG") val sqlContext = spark。sqlContext spark. sparkcontext . addjar ("~/jars/geospark-sql_2.3-1.2.0.jar") spark. sparkcontext . addjar ("~/jars/geospark-1.2.0.jar") geosparksqlregister . registerall (sqlContext) println(spark. sessionstate . functionregistry . listfunction) spark. sparkcontext . addjar ("~/jars/geospark-1.2.0.jar")sql("select ST_GeomFromWKT(area) AS geometry from polygon").show()

導致

DBConnect不支持客戶端udf與服務器的自動同步。

解決方案

方法在集群上注冊UDF的代碼可以使用自定義實用程序jarSparkSessionExtensions類。

  1. 創建一個實用工具jar,用於注冊GeoSpark函數SparkSessionExtensions.這個實用程序類定義可以構建到實用程序jar中。
    %scala package com.databricks.spark.utils import org.apache.spark.sql.SparkSessionExtensions import org.datasyslab. geosparksessionsql .utils. GeoSparkUdfExtension extends (SparkSessionExtensions => Unit) {def apply(e: SparkSessionExtensions): Unit = {e.j injectcheckrule (spark => {println(" inject UDF") geosparksessionregister . registerall (spark) _ => Unit})}}
  2. 將GeoSpark jar和您的實用工具jar複製到DBFSdbfs: /磚/ geospark-extension-jars /
  3. 創建初始化腳本(set_geospark_extension_jar.sh)將jar文件從DBFS位置複製到Spark類路徑,並設置spark.sql.extensions到實用程序類。
    % scala dbutils.fs。put (" dbfs: /磚/ < init-script-folder > / set_geospark_extension_jar.sh”,“”“# !/bin/sh |sleep 10s |#複製擴展和GeoSpark依賴jar到/databricks/jars。|cp -v /dbfs/databricks/geospark-extension-jars/{spark_geospark_extension_2_11_0_1.jar, geospark_sql_2_3_1_2_1 .jar} /databricks/jars/ |#設置擴展名。|cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf |[driver] {| "spark.sql. conf << 'EOF' > /databricks/driver/conf/00-custom-spark.conf |[driver] {擴展com.databricks.spark.utils“=”。GeoSparkUdfExtension" |} |EOF |""" "。stripMargin,覆蓋= true)
  4. 將初始化腳本安裝為集群範圍的初始化腳本(AWS|Azure|GCP).您需要腳本位置的完整路徑(dbfs: /磚/ < init-script-folder > / set_geospark_extension_jar.sh).
  5. 重新啟動集群。
  6. 現在可以在DBConnect中使用GeoSpark代碼。